在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-12-18 15:55:53