尽管如此,如果debuggable =“true”& ;,则写入(在 http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html中)默认情况下CheckJNI处于打开状态. targetSdkVersion至少是Ice Cream Sandwich(在AndroidManifest.xml文件中) – CheckJNI的调试输出转储(警告和错误)仍然打印在DDMS中,即使我使用Gingerbread值并将其安装在Gingerbread模拟器上也是如此.
我发现的唯一区别是Ice Cream三明治模拟器上的CheckJNI警告(无论我的AndroidManifest.xml文件中的值是什么)都会导致应用程序崩溃并引发受到尊重的警告 – 而它们只会打印在姜饼模拟器(我测试了一个用于本地引用的DeleteGlobalRef以引发此警告).
根据AndroidManifest.xml打印两个非信息日志 – 但CheckJNI模式的日志不受影响.
这是日志 –
#On 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)
#On姜饼:
安装应用程序后:
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)
所以我的问题是我应该如何打开/关闭它 – 它应该如何以不同的方式影响应用程序(或日志)?
谢谢.
解决方法
更令您困惑的是,您显示的DeleteGlobalRef警告不是CheckJNI pre-ICS的一部分.在旧的本地/全局参考实现中,它基本上是一些调试输出.作为ICS工作的一部分,它被转移到CheckJNI,它可能一直都是.
所以你所看到的所有行为都是字面意义上的“预期”,即使它有点令人惊讶!
如果你看看http://developer.android.com/guide/practices/design/jni.html你可能会在模拟器中关闭CheckJNI,虽然我不确定你为什么要这样做,所以我不会再鼓励你了!您真正想要做的是修复您拥有的任何JNI错误,以确保您的应用程序继续在未来版本的Android上运行:-)
(我对我的“JNI警告:非全局0x41339550(类型= 1)上的DeleteGlobalRef”诊断的质量感到失望 – 我会看到比“非全局”更具体,并删除“type = 1“,它至少应与< jni.h>枚举中的一个引用类型的数值相匹配.)
如果你在这个区域四处寻找,请参阅http://code.google.com/p/android/issues/detail?id=21674 —全局参考的向后兼容性不起作用;只有本地参考.因此,如果将targetSdkVersion设置为低不适合您,可能是因为我们无论如何都要分发间接全局引用(即使本地引用是直接的).