草庐IT

android - JNI 错误(应用程序错误): accessed stale local reference 0xbc00021 (index 8 in a table of size 8)

coder 2023-11-20 原文

我从本书 Android 应用程序和温度转换器应用程序中制作了 hello world 应用程序 from here 两者都在模拟器上运行良好,但是当我尝试在 Samsung Note 2 上运行它时,LogCat 出现以下错误

02-08 07:22:18.665: E/dalvikvm(30944): JNI ERROR (app bug): accessed stale local reference 0xbc00021 (index 8 in a table of size 8)
02-08 07:22:18.665: E/dalvikvm(30944): VM aborting
02-08 07:22:18.665: A/libc(30944): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 30944 (oid.temperature)

两个应用程序都打开显示带有标题的布局但不显示布局中的任何其他 View

sample 运行良好

device: note 2 Samsung-gt_n7100

IDE:Eclipse version 3.8

OS: 64bit Windows 7

最佳答案

自从 android 4.0 垃圾收集器被改变。现在它在垃圾回收期间移动对象,这会导致很多问题。

假设你有一个静态变量指向一个对象,然后这个对象被 gc 移动。由于 android 使用 java 对象的直接指针,这意味着您的静态变量现在指向内存中的随机地址,未被任何对象占用或被不同类型的对象占用。这几乎可以保证您下次使用此变量时将获得 EXC_BAD_ACCESS。

所以 android 给你 JNI ERROR (app bug) 错误来防止你得到不可调试的 EXC_BAD_ACCESS。现在有两种方法可以避免这个错误。

  1. 您可以将 list 中的 targetSdkVersion 设置为版本 11 或更低版本。这将启用 JNI 错误兼容模式并完全防止任何问题。这就是您的旧示例有效的原因。

  2. 您可以避免使用指向 java 对象的静态变量,或者在通过调用 env->NewGlobalRef(ref) 存储它们之前使 jobject 引用成为全局引用。
    也许这里最大的例子之一就是保留 jclass 对象。通常,您将在 JNI_OnLoad 期间初始化静态 jclass 变量,因为只要应用程序正在运行,类对象就会保留在内存中。

这段代码会导致崩溃:

static jclass myClass;

JNIEXPORT jint JNICALL JNI_OnLoad (JavaVM * vm, void * reserved) {  
    myClass = env->FindClass("com/example/company/MyClass");  
    return JNI_VERSION_1_6;  
}

虽然这段代码可以正常运行:

static jclass myClass;

JNIEXPORT jint JNICALL JNI_OnLoad (JavaVM * vm, void * reserved) {  
    jclass tmp = env->FindClass("com/example/company/MyClass");  
    myClass = (jclass)env->NewGlobalRef(tmp);
    return JNI_VERSION_1_6;  
}

有关更多示例,请参阅 Marek Sebera 提供的链接:http://android-developers.blogspot.cz/2011/11/jni-local-reference-changes-in-ics.html

关于android - JNI 错误(应用程序错误): accessed stale local reference 0xbc00021 (index 8 in a table of size 8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14765776/

有关android - JNI 错误(应用程序错误): accessed stale local reference 0xbc00021 (index 8 in a table of size 8)的更多相关文章

随机推荐