码迷,mamicode.com
首页 > 移动开发 > 详细

android的reference table的问题

时间:2015-01-26 13:24:30      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

写得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是对应的吧。懒得测试了。先这样吧…

 

android的reference table的问题

标签:

原文地址:http://www.cnblogs.com/darkknightzh/p/4249842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!