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 ...
随机推荐
- Comparator TreeSet
package study; import java.util.Comparator;import java.util.TreeSet; public class TreeSetTest { publ ...
- 从汇编看c++中含有虚基类对象的析构
c++中,当继承结构中含有虚基类时,在构造对象时编译器会通过将一个标志位置1(表示调用虚基类构造函数),或者置0(表示不调用虚基类构造函数)来防止重复构造虚基类子对象.如下图菱形结构所示: 当构造类B ...
- SSH 5W学习
what SSH的英文全称为Secure Shell,是IETF(Internet Engineering Task Force)的Network Working Group所制定的一族协议,其目的是 ...
- javascript写的新闻滚动代码
在企业站中,我们会看到很多新闻列表很平滑的滚动,但是这种功能自己写太浪费时间,下面是我整理好的一组很常用的新闻列表滚动,有上下分页哦! 1.body里面 <div class="tz_ ...
- python 在linux下通过top,和dh命令获得cpu,内存,以及硬盘信息
主要是通过os.popen读取命令输出实现的,os.popen启动新的进程,且将外部命令的输出作为文件类型对象返回.不能获得外部命令的返回值.既然是文件对象就可以直接用for in 来读取,代码如下: ...
- C语言数据类型转换
变量的数据类型是可以转换的.转换的方法有两种,一种是自动转换,一种是强制转换. 自动转换 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成.自动转换遵循以下规则: 若参与运算量的类型不同, ...
- 一次oracle大量数据删除经历
oracle有个数据表现在已经有2500万条数据了,软件用到这个表的数据时就变的特别慢,所以准备把一个月以前的数据全部清除. 我的步骤是(下边操作都是在plsql中运行的) 1.首先 将这个月的数据导 ...
- I2C_周立功标准驱动程序_c代码
/****************************************Copyright (c)********************************************** ...
- 什么是队列(Queue)?
类似于链表和堆栈,队列也是存储数据的结构.队列中数据进入队列的顺序很重要,一般来说,队列就是一群人或者事物按照排好的顺序等待接受服务或者处理. 定义:队列,又称为伫列(queue),是先进先出(FIF ...
- 关于set和map的用法
1.set 定义:每个元素最多只出现一次,并且默认的是从小到大排序. set 遍历: 题目http://www.cnblogs.com/ZP-Better/p/4700218.html for(set ...