Android的CheckJNI:如何关闭/打开它(在模拟器上)?文档似乎有问题

我花了一些时间使用我的应用程序的 Android模拟器检查checkjni模式.
尽管如此,如果debuggable =“true”&amp ;,则写入(在 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)

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

谢谢.

解决方法

模拟器很特别. CheckJNI始终在模拟器中打开.

更令您困惑的是,您显示的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设置为低不适合您,可能是因为我们无论如何都要分发间接全局引用(即使本地引用是直接的).

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...