zoukankan      html  css  js  c++  java
  • 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是对应的吧。懒得测试了。先这样吧…

  • 相关阅读:
    列表左边左右固定,右边可以左右滚动,且左右两边列表滚动时上下联动
    SQL分组多列统计(GROUP BY后按条件分列统计)
    C# 调用webservice 几种办法(转载)
    解析XML文档
    GDI+中发生一般性错误的解决办法
    所闻所获2:使用块回调来实现代理的功能
    OC基础11:基本的C语言特性2
    OC基础10:基本的C语言特性1
    OC基础9:预处理程序
    OC基础8:分类和协议
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4249842.html
Copyright © 2011-2022 走看看