android的reference table的问题
写得android程序总是崩溃,感觉像是内存泄露,但是检查代码发现该释放的都释放了。最终无奈,删除了接口函数中的调用,只使用下面的测试代码。
JNIEXPORT jboolean JNICALL Java_com_example_X_XX_XXX
(JNIEnv * env, jclass, jbyteArray temp1, jdoubleArray temp2)
{
jboolean* pArraytemp1 = (jboolean*) env->GetPrimitiveArrayCritical(temp1, );
jdouble* pArraytemp2 = (jdouble*) env->GetPrimitiveArrayCritical(temp2, ); bool result=true; env->ReleasePrimitiveArrayCritical(temp1, pArraytemp1, JNI_COMMIT);
env->ReleasePrimitiveArrayCritical(temp2, pArraytemp2,JNI_COMMIT); return result;
}
程序中什么代码都没有,但是调用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的问题的更多相关文章
- android 内存泄露之jni local reference table overflow (max=512)
在android项目中要实现一个需求 为了性能的要求只能用c代码来实现功能. 这样就牺牲了java跨平台性. 通过加载.so的方式,把用c实现的模块集成到app中. android提供jni层,作为一 ...
- Android表格布局(Table Layout)
Android表格布局(Table Layout) 先来看布局管理器之间继承关系图: 图1 可知TableLayout继承了LinearLayout,所以表格布局本质上依然是线性管理器. 表格布局采用 ...
- Android no such table (找不到表)
今天在学习项目时,一直报错no such table Users.说找不到Users表.我就纳闷了,数据库是复制过去的,检查表名也没有写错.这是怎么回事呢?检查了半天才发现原来是数据库的路径错了. 我 ...
- Android Studio Reference local .aar files
repositories { flatDir { dirs 'libs' }} dependencies { compile 'com.android.support:support-v4:22.2. ...
- JNI内存泄露JNI ERROR (app bug): local reference table overflow (max=512)
原因是没即时释放对象,原本的代码是这样 static jobject getMaps(JNIEnv *env,jclass obj) { jclass stringbuilder_class = (* ...
- Android笔记——SQLiteOpenHelper类
public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...
- Android Animation学习(一) Property Animation原理介绍和API简介
Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...
- Android Content Provider基础
Android Content Provider基础 Content Providers Content providers管理对一个结构化的数据集合的访问.它们封装了数据,并且提供了保护数据安全性的 ...
- Android NDK之JNI陷阱
背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台.这就涉及到Android NDK(native develop kit)内容.这里只想记录下JNI ...
随机推荐
- noip2015 提高组day1、day2
NOIP201505神奇的幻方 试题描述 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3,……,N∗N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方 ...
- vim 折叠技巧
转自:http://www.2cto.com/os/201203/122133.html 主要命令: zf-创建折叠 zf20G--创建折叠,从当前行折叠到第20行 zfgg--创建折叠,从当前位置折 ...
- ORACLE的客户端如何连接到数据库
如何连接oracle数据库及故障解决办法 如何配置才能使客户端连到数据库: 要使一个客户端机器能连接oracle数据库,需要在客户端机器上安装oracle的客户端软件,唯一的例外就是jav ...
- Django1.7官方文档中的tutorial——翻译
写下你的第一个Django应用,第一部分 让我们通过例子来学习. 通过这篇指南,我们将会带你浏览一遍一个基本投票应用的创建. 它由两部分组成: 1一个让人们查看投票和进行投票的公共站点 2一个让你添加 ...
- checkbox选中问题
<head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu ...
- [分享]我的LABVIEW快速开发串口测试软件实例
LABVIEW是美国国家仪器公司(National Instruments,简称NI)的创新产品,它允许编程人员使用图形方式来进行编程,摒弃了艰涩难懂的代码,只需要拖动相应图形控件然后连线,进行简单的 ...
- jQuery_基础
一.jQuery与DOM对象的转换. 1.jQuery对象转换为DOM对象:$cr[0] 或 $cr.get(0) $cr为jQuery对象 2.DOM对象转换为jQuery对象:$(cr) cr为D ...
- EMMA: 免费java代码测试覆盖工具
From:http://emma.sourceforge.net/ EMMA: a free Java code coverage tool Code coverage for free: a b ...
- Combination Sum II 解答
Question Given a collection of candidate numbers (C) and a target number (T), find all unique combin ...
- HDU5441 Travel (离线操作+并查集)
Travel Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...