【问题标题】:Android's CheckJNI: How to turn it off/on (on an emulator)? Documentation seems to be faultyAndroid 的 CheckJNI:如何关闭/打开它(在模拟器上)?文档似乎有问题
【发布时间】:2012-02-13 06:27:45
【问题描述】:

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

我发现的唯一区别是冰淇淋三明治模拟器上的 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)

#在姜饼上:

安装应用后:

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)

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

谢谢。

【问题讨论】:

    标签: android android-emulator java-native-interface


    【解决方案1】:

    模拟器很特别。 CheckJNI 在模拟器中始终处于开启状态。

    让您更加困惑的是,您显示的 DeleteGlobalRef 警告并不是 CheckJNI pre-ICS 的一部分。它基本上是旧的本地/全局参考实现中的一些调试输出。作为 ICS 工作的一部分,它被移到了 CheckJNI,它可能一直都在。

    所以你看到的所有行为都是字面意义上的“预期”,即使它有点令人惊讶!

    如果您查看http://developer.android.com/guide/practices/design/jni.html,您可能可以在模拟器中关闭 CheckJNI,但我不确定您为什么要这样做,所以我不会再鼓励您了!您真正想要做的是修复任何 JNI 错误,以确保您的应用在未来的 Android 版本上继续运行 :-)

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

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

    【讨论】:

    【解决方案2】:

    在模拟器上关闭 CheckJNI 的步骤(经过测试并为我工作)-
    1)
    adb 外壳停止
    adb shell setprop dalvik.vm.checkjni 假
    亚行外壳启动
    2) 让模拟器在屏幕上重新启动。
    3)安装apk。在 DDMS 日志中,您应该看到 CheckJNI 已关闭。
    默认情况下,在模拟器中安装每个应用程序时,它都会显示 CheckJNI 处于打开状态。

    此链接提供更多信息: http://developer.android.com/training/articles/perf-jni.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2015-03-22
      • 2019-05-08
      • 2013-02-23
      • 2012-05-26
      相关资源
      最近更新 更多