android的reference table的问题

写得android程序总是崩溃,感觉像是内存泄露,但是检查代码发现该释放的都释放了。最终无奈,删除了接口函数中的调用,只使用下面的测试代码。

 

 1 JNIEXPORT jboolean JNICALL Java_com_example_X_XX_XXX
 2   (JNIEnv * env, jclass, jbyteArray temp1, jdoubleArray temp2)
 3 {
 4     jboolean* pArraytemp1 = (jboolean*) env->GetPrimitiveArrayCritical(temp1, 0);
 5     jdouble* pArraytemp2 = (jdouble*) env->GetPrimitiveArrayCritical(temp2, 0);
 6 
 7     bool result=true;
 8 
 9     env->ReleasePrimitiveArrayCritical(temp1, pArraytemp1, JNI_COMMIT);
10     env->ReleasePrimitiveArrayCritical(temp2, pArraytemp2,JNI_COMMIT);
11 
12     return result;
13 }

程序中什么代码都没有,但是调用2000次,程序总会崩溃。后来使用下面命令

adb shell setprop debug.checkjni 1

看到程序总会在512次之后崩溃。发现下面提示

jni pinned array reference table dump

网上说是android的reference table的原因,我没有释放缓冲区,因而每次总会往reference table里面添加,直至超过最大值1024(每次保存temp1和temp2两个参数,因而512次的时候已经到了reference table的最大值1024),程序崩溃。

搜了半天,也没有找到好的解决方法。最后看了一下JNI_COMMIT的定义,

上面写着JNI_COMMIT 是/* copy content, do not free buffer */。之后改成了0,上面的代码运行了50000次,也没有崩溃。

所以说以前的程序释放的时候,最后一个参数都是JNI_COMMIT,估计用多了都会有问题,还好写得android不多,等碰上的时候再改吧…

 

ps,其实网上有的参考代码在GetPrimitiveArrayCritical函数中的最后一个参数是使用的,可能和ReleasePrimitiveArrayCritical是对应的吧。懒得测试了。先这样吧…

 

posted on 2015-01-26 11:31  darkknightzh  阅读(658)  评论(0编辑  收藏  举报

导航