大佬教程收集整理的这篇文章主要介绍了android – JNI ERROR(应用程序错误):访问过时的本地引用0xbc00021(索引8在一个大小为8的表中),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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)
样品运行正常
想象一下,你有一个静态变量指向一个对象,然后这个对象被gc移动.由于android使用java对象的直接指针,这意味着您的静态变量现在指向内存中的随机地址,不被任何对象占用或被不同排序对象所占用.这几乎可以保证您下次使用此变量时会获得EXC_BAD_ACCESs.
所以android给你的JNI错误(应用程序错误)错误,以防止你得到不可调用的EXC_BAD_ACCESs.现在有两种方法来避免这个错误.
>您可以将清单中的targetSdkVersion设置为11或更低版本.这将启用JNI错误兼容性模式并防止任何问题.这就是为什么你的旧例子正在工作的原因.
>您可以通过调用env-> NewGlobalRef(ref)来避免使用指向java对象的静态变量或使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 ERROR(应用程序错误):访问过时的本地引用0xbc00021(索引8在一个大小为8的表中)全部内容,希望文章能够帮你解决android – JNI ERROR(应用程序错误):访问过时的本地引用0xbc00021(索引8在一个大小为8的表中)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。