JNI ERROR (app bug): accessed stale local reference 0xbc00021

在android ndk编程时,要使用到.so文件,so文件使用c语言编写的。当我在c文件中调用java类时,第一次调用时没问题的,但第二次调用的时候就失败了。上网搜了很多资料,大概原因是在jni中,使用指针指向某一个java对象的时候,由于android的垃圾回收机制(Garbage Collector),如果java对象被回收的话,那么指针指向的对象就会为空或者不存在,从而提示JNI ERROR:accessed stale(陈旧的,落后的) local reference 大概的意思就是变量已经不存在了。所以要解决这个问题,就要求把java对象定义成静态的,这样可以避免被被回收(在Android4.0以后,静态变量也会被回收,但概率较小),从而导致错误的产生。下面是我的实例:

jobject mTestProvider;

mTestProvider = (*jniEnv)->NewObject(jniEnv, obj_class, construction_id);

修改后:

static jobject mTestProvider;

jobject obj = jobject obj = (*jniEnv) ->NewObject(jniEnv,obj_class,construction_id);

mTestProvider = (jobject) (*jniEnv) ->NewGlobalRef(jniEnv,obj);

以上仅是个人的经验,希望能解决你的问题!

时间: 2024-10-17 06:50:29

JNI ERROR (app bug): accessed stale local reference 0xbc00021的相关文章

Jni Error(app bug): accessed stale local reference 的另类出现方式

Jni Error(app bug): accessed stale local reference 这个错误平常是 弱全局变量引起的时候 出现的一个错误,但是今天我却在另外一种情况下遇到了 下面是错误截图 出现错误的原因其他很简单 是因为自己的粗心引起的 java层函数声明是这么写的 public native String screenshot(int x,int y,int x1,int y1,byte[] path); jni是这么写的 void Java_java_api_JniUti

cordova调用Notification插件部分手机报错JNI ERROR (app bug): accessed stale local reference

写了一个Android notification本地通知插件,在4.0版本的小米出现了问题. 使用了Notification.Builder的方法.但是小米这个会报标题上的错误. 于是改为旧的方法做兼容. Notification notify = new Notification(R.drawable.icon,args.getString(0),System.currentTimeMillis()); notify.setLatestEventInfo(cx, args.getString(

Android中JNI调用时出现accessed stale local reference的问题

之前在做一个native的模块时遇到这样一个问题: 代码运行在android2.3上没有任何问题,可是在4.2上运行时报出了:JNI ERROR (app bug): accessed stale local reference 的错误. 后来在StackOverflow上找到了问题的答案.简单来说就是  4.0以上的android系统GC在垃圾回收时为了减少内存碎片,会对内存进行整理,整理时必然会移动对象的内存地址,这时C代码的指针还指向原来对象的地址,这时该对象已经被移动到了其他位置,因此会

JNI内存泄露JNI ERROR (app bug): local reference table overflow (max=512)

原因是没即时释放对象,原本的代码是这样 static jobject getMaps(JNIEnv *env,jclass obj) { jclass stringbuilder_class = (*env)->FindClass(env,"java/lang/StringBuilder"); jmethodID init_stringbuilder_Method = (*env)->GetMethodID(env,stringbuilder_class,"<

JNI局部引用表溢出:local reference table overflow (max=512)

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44873769 在<JNI/NDK开发指南(十)--JNI局部引用.全局引用和弱全局引用>这篇文章中详细介绍了在JNI中三种引用的使用方式,区别.应用场景和开发注意事项.由于都是理论,看完之后可能印象不够深刻,由其是在开发当中容易出错的地方.所以这篇文章用一个例子说明引用使用不当会造成的问题,以引起大家对这个知识点的重视. 首先创建一个Android工程,在主界面放一个文本框和一个按钮,

Android JNI局部引用表溢出:local reference table overflow (max=512)

<JNI/NDK开发指南(十)——JNI局部引用.全局引用和弱全局引用>这篇文章中详细介绍了在JNI中三种引用的使用方式,区别.应用场景和开发注意事项.由于都是理论,看完之后可能印象不够深刻,由其是在开发当中容易出错的地方.所以这篇文章用一个例子说明引用使用不当会造成的问题,以... songtaste.com/user/10271950/infosongtaste.com/user/10271975/infosongtaste.com/user/10271978/infosongtaste.

JNI Local Reference Changes in ICS

[This post is by Elliott Hughes, a Software Engineer on the Dalvik team. — Tim Bray] If you don’t write native code that uses JNI, you can stop reading now. If you do write native code that uses JNI, you really need to read this. What’s changing, and

ERROR: Failed to load /usr/local/ERL_LIBS_FILE/esdl/rebar.config

***ERROR:Could not find sdl-config ERROR: Failed to load /usr/local/ERL_LIBS_FILE/esdl/rebar.config: {error, {228,file, {throw, error, [{erl_eval, do_apply, 5}, erl_eval, expr,5}, erl_eval, exprs, 5}, {erl_eval, expr,5}, {file, eval_stream2, 6}, {fil

error: &#39;Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39; (2)&#39;

[[email protected] ~]#   /usr/bin/mysqladmin -u root password 'aaaaaa' /usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)' Check that mysqld is runni