VM启动时需要一些启动参数,包含标准参数和非标准参数。这里涉及到两个标准参数:-Xcheck:jni和-verbose:jni。

这两个参数都设置的话,JNI调用路径就可以由dalvikvm打印出来,并通过logcat看到。

可以在下面这个文件中控制是否为VM添加这两个启动参数。

/frameworks/base/core/jni/AndroidRuntime.cpp

先看一下第一个代码片段

property_get("dalvik.vm.checkjni", propBuf, "");

if (strcmp(propBuf, "true") == 0) {

checkJni = true;

} else if (strcmp(propBuf, "false") != 0) {

/* property is neither true nor false; fall back on kernel parameter */

property_get("ro.kernel.android.checkjni", propBuf, "");

if (propBuf[0] == '1') {

checkJni = true;

}

}

"dalvik.vm.checkjni"和ro.kernel.android.checkjni这两个系统属性控制着变量checkJni,而checkJni这个变量的意义在于:

if (checkJni) {

/* extended JNI checking */

opt.optionString = "-Xcheck:jni";

mOptions.add(opt);

... ...

/* with -Xcheck:jni, this provides a JNI function call trace */

opt.optionString = "-verbose:jni";

mOptions.add(opt);

}

可以看出,可以checkJni为true,-Xcheck:jni和-verbose:jni这两个VM启动参数就会被用作启动VM。默认状态下,添加-verbose:jni这个参数的两行代码是被注释掉的,如果需要调试的问题和JNI有关,可以把注释打开。

可惜的是,一旦JNI调试被打开,会打印大量的垃圾信息,所以得慎用。我还在继续寻找有没有更高效的方法。

关于VM的启动参数参考下面这两篇文章

Java启动参数

java -verbose命令

0b1331709591d260c1c78e86d0c51c18.png

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐