在android中调用jni,出现ReferenceTable overflow (max=1024)

转:http://m.blog.csdn.net/blog/redouba/20624631

最近在做android监控方面的项目,在调用.so库解码的时候,运行时间长了就会报出 ReferenceTable overflow (max=1024)的错误。然后再网上搜啊搜,大致的结果就是没有释放资源种种。。

参考资料:

问题来源:

写了一个较为复杂的Native so库,里面使用了链表,从链表中取出数据,装载到Java LinkedList中。

当测试数据较小的时候还没有问题,当测试数据达到一定规模的时候就出现了ReferenceTable overflow (max=512)错误。

解决问题:

1.我们通过阅读JNI的文档,对于FindClass 返回的一定需要调用DeleteLocalRef,还有jbyteArray 类型的变量需要DeleteLocalRef。

在我的代码中,这些都已经进行了处理,那么还有那些是Local Ref?

NewString/ NewStringUTF/NewObject/ GetObjectField生成的是不是?

通过测试发现,这些都是,Local Ref。

2.虽然把上面发现的都修改了,但还是出现ReferenceTable overflow (max=512)错误,通过代码阅读发现。有一处代码是这样写的。

SetObjectField(dwi, jfID, env->NewStringUTF(szDateTime))

问题就在env->NewStringUTF(szDateTime)地方,因为这种写法也是看Sun JNI的文档这样写的,因其在链表的循环中,在没有退出函数前,JNI的NewStringUTF产生的LocelRef不停的产生,从而导致ReferenceTable overflow (max=512)。

总结:

1.FindClass /NewString/ NewStringUTF/NewObject/ GetObjectField等产生的都是LocalRef,LocalRef有三种方式被VM 的GC清理。

2.不要学Sun JNI文档中类似下面的写法SetObjectField(dwi, jfID, env->NewStringUTF(szDateTime))。

http://blog.csdn.net/win2k3net/article/details/6613440

各种检查发现文件中资源也已经释放了,为什么还会报错呢!正头疼之际,没法子继续找吧,苍天不负有心人。终于被我找到了:

就是在return之前没有释放掉资源所导致的。

参考:http://bbs.csdn.net/topics/390445365

问题终于得以解决,感谢各位前辈们,大哥大姐们,大叔大婶们

时间: 2024-08-02 10:56:43

在android中调用jni,出现ReferenceTable overflow (max=1024)的相关文章

mixare的measureText方法在频繁调用时抛出“referencetable overflow max 1024”的解决方式

这几天在搞基于位置的AR应用,採用了github上两款开源项目: mixare android-argument-reality-framework 这两个项目实现机制大致同样.我选取的是android-argument-reality-framework.原因是我觉得他的代码结构要清晰非常多(纯属个人意见). 这两个项目的demo在执行时都会crash,通过查看控制台,能够看到例如以下信息: 07-31 14:35:38.685: W/dalvikvm(13686): ReferenceTab

Android中调用jni

Android中JNI的使用方法(转) 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, 底层包括系统和使用众多的LIiraries都是C/C++编写的. 所以上层Java要调用底层的C/C++函数库必须通过Java的JNI来实现. 下面将学习Android是如何通过Jni来实现Java对C/C++函数的调用.以HelloWorld程序为例: 第一步: 使用Java编写Hello

【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过JNI的可以看看我之前的博客(Windows下利用Visual Studio开发的过程):http://cherishlc.iteye.com/admin/blogs/1328136 以及自动生成工具swig的

android中使用jni对字符串加解密实现分析

android中使用jni对字符串加解密实现分析 最近项目有个需求,就是要对用户的敏感信息进行加密处理,比如用户的账户密码,手机号等私密信息.在java中,就对字符串的加解密我们可以使用AES算法加密字符串,使用它的好处就不必多说了,但我们又知道android的源代码是可以被反编译的,所以使用纯Java方式的AES加密是不安全的,所以想到了使用android中的jni来对字符串加解密处理,它会产生一个.so文件,更重要的是它通过C/C++代码实现,所以安全行比较高,它可以被反编译成机器码,但几乎

Android中关于JNI 的学习(零)简单的例子,简单地入门

Android中JNI的作用,就是让Java能够去调用由C/C++实现的代码,为了实现这个功能,需要用到Anrdoid提供的NDK工具包,在这里不讲如何配置了,好麻烦,配置了好久... 本质上,Java去调用C/C++的代码其实就是去调用C/C++提供的方法,所以,第一步,我们要创建一个类,并且定义一个Native方法,如下: JniTest类: public class JniTest { public native String getTestString(); } 可以看到,在这个方法的前

深入理解Android(2)——理解Android中的JNI(中)

阳光小强参加了CSDN博客之星评选,如果你觉得阳光小强的博客对你有所帮助,为小强投上一票吧:http://vote.blog.csdn.net/blogstar2014/details?username=lxq_xsyu#content 在上一篇中我们了解了Android中有关JNI的使用,其实JNI是很早就有的,不是在Android创造的新技术,是SUN为我们提供的一种Java和本地代码之间相互调用的方法,这一篇我们来建立一个普通的Java工程来具体看一下Java中如何调用C/C++代码. 一

Android中关于JNI 的学习(四)简单的例子,温故而知新

在第零篇文章简单地介绍了JNI编程的模式之后,后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我到底说的清楚没有,但相信很多童鞋跟我一样,在刚开始学习一个东西的时候,入门最好的方式就是一个现成的例子来参考,慢慢研究,再学习概念,再回过来研究代码,加深印象,从而开始慢慢掌握. 今天我们就再来做一个小Demo,这个例子会比前面稍微复杂一点,但是如果阅读过前面几篇文章的话,理解起来也还是很简单的.很多东西就是这样,未知的时候很可怕,理解了就很简单了. 1)我们首先定义一个Jav

Android中关于JNI 的学习(三)在JNI层访问Java端对象

前面两篇文章简单介绍了JNI层跟Java层的一些对应关系,包括方法名,数据类型和方法名称等,相信在理论层面,能够很好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,由于表达能力或者理解还是有限,有些地方讲得不是很清楚,如果各位朋友有觉得云里雾里,欢迎大家留言一起学习. 概念上的理解有助于我们更好地认识JNI,而一些实际点的例子则能够更好地帮我们从代码上去掌握并应用JNI. 在第一篇文章,我们是从一个小例子来入门学习的,在其中,我们通过JNI层函数返回

Android中关于JNI 的学习(零)简单的样例,简单地入门

Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,Java去调用C/C++的代码事实上就是去调用C/C++提供的方法.所以,第一步,我们要创建一个类,而且定义一个Native方法.例如以下: JniTest类: public class JniTest { public native String getTestString(); } 能够看到,在这