我花了一些时间在我的应用程序中使用Android模拟器检查checkjni模式。
如果debuggable =“true”和targetSdkVersion至少是Ice Cream Sandwich(在AndroidManifest.xml文件中),则默认情况下(在http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html中)已将CheckJNI设置为默认打开-CheckJNI的调试输出转储(警告和错误)为即使我使用Gingerbread值并将其安装在Gingerbread模拟器上,它仍然会打印在DDMS中。

我发现的唯一区别是Ice Cream Sandwich模拟器上的CheckJNI警告(无论我的AndroidManifest.xml文件中的值是什么)都会导致应用程序崩溃,并带有受人尊敬的警告-尽管它们只会打印在 Gingerbread 模拟器(我已经测试了用于本地引用的DeleteGlobalRef来引发此警告)。

根据AndroidManifest.xml打印了两个非信息日志-但CheckJNI模式的日志不受影响。

这是日志-

#在ICS仿真器上
安装应用程序后:

 01-19 08:43:01.491: D/AndroidRuntime(32): CheckJNI is ON

Loading the app:
01-19 08:32:26.617: D/dalvikvm(590): Not late-enabling CheckJNI (already on)

(The last line is printed only when debuggable="true")

01-19 08:32:27.066: I/dalvikvm(590): Turning on JNI app bug workarounds for target SDK version 10...

(The last line is printed only when targetSdkVersion=10)

关于错误代码(崩溃):
01-19 08:37:56.176: W/dalvikvm(651): JNI WARNING: DeleteGlobalRef on non-global 0x41339550 (type=1)

...

01-19 08:37:56.187: E/dalvikvm(651): VM aborting

01-19 08:37:56.187: A/libc(651): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)

#在 Gingerbread 上:

安装应用程序后:
01-19 08:43:01.491: D/AndroidRuntime(32): CheckJNI is ON

Loading the app:

没有重要的日志

错误代码(无崩溃):
01-19 08:45:20.079: W/dalvikvm(304): JNI: DeleteGlobalRef(0x40608718) failed to find entry (valid=1)

所以我的问题是我应该如何打开/关闭它-开启时它应该如何以不同的方式影响应用程序(或日志)?

谢谢。

最佳答案

该仿真器很特殊。 CheckJNI在模拟器中始终处于打开状态。

更令人困惑的是,您显示的DeleteGlobalRef警告不是CheckJNI pre-ICS的一部分。基本上,这是旧的本地/全局引用实现中的调试输出。作为ICS工作的一部分,它已经转移到CheckJNI中,应该一直在那里。

因此,从字面上看,您看到的所有行为都是“预期的”,即使有些令人惊讶!

如果您查看http://developer.android.com/guide/practices/design/jni.html,也许可以在模拟器中关闭CheckJNI,尽管我不确定您为什么要这样做,所以我不鼓励您这样做!您真正想要做的是修复您拥有的所有JNI错误,以确保您的应用程序在 future 的Android版本上可以正常工作:-)

(对于“JNI警告:非全局0x41339550(type = 1)上的DeleteGlobalRef”诊断的质量,我感到失望–-我将看到比“非全局”更具体,并删除“type = 1”,至少应与枚举中的一种引用类型的数值匹配。)

如果您在这方面闲逛,另请参阅http://code.google.com/p/android/issues/detail?id=21674 ---全局引用的向后兼容性不起作用;请参见ojit_a。仅本地引用。因此,如果将targetSdkVersion设置为低对您不起作用,则可能是因为无论如何我们都会发出间接的全局引用(即使本地引用将是直接的)。

09-26 11:44