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) 编辑 收藏 举报