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之後,靜態變量也會被回收,但機率較小),從而致使錯誤的產生。下面是個人實例:java

jobject mTestProvider;android

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

修改後:ide

static jobject mTestProvider;指針

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

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

以上僅是我的的經驗,但願能解決你的問題!class

相關文章
相關標籤/搜索