`
iaiai
  • 浏览: 2142109 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jni未释放资源问题。Failed adding to JNI local ref table (has 512 entries)

 
阅读更多
Native Code 本身的内存泄漏

JNI 编程首先是一门具体的编程语言,或者 C 语言,或者 C++,或者汇编,或者其它 native 的编程语言。每门编程语言环境都实现了自身的内存管理机制。因此,JNI 程序开发者要遵循 native 语言本身的内存管理机制,避免造成内存泄漏。以 C 语言为例,当用 malloc()在进程堆中动态分配内存时,JNI 程序在使用完后,应当调用 free() 将内存释放。总之,所有在 native 语言编程中应当注意的内存泄漏规则,在 JNI 编程中依然适应。

Native 语言本身引入的内存泄漏会造成 native memory 的内存,严重情况下会造成 native memory 的 out of memory。

Global Reference 引入的内存泄漏

JNI 编程还要同时遵循 JNI 的规范标准,JVM 附加了 JNI 编程特有的内存管理机制。

JNI 中的 Local Reference 只在 native method 执行时存在,当 native method 执行完后自动失效。这种自动失效,使得对 Local Reference的使用相对简单,native method 执行完后,它们所引用的 Java 对象的 reference count 会相应减 1。不会造成 Java Heap 中 Java 对象的内存泄漏。

而 Global Reference 对 Java 对象的引用一直有效,因此它们引用的 Java 对象会一直存在 Java Heap 中。程序员在使用 Global Reference时,需要仔细维护对 Global Reference 的使用。如果一定要使用 Global Reference,务必确保在不用的时候删除。就像在 C 语言中,调用malloc() 动态分配一块内存之后,调用 free() 释放一样。否则,Global Reference 引用的 Java 对象将永远停留在 Java Heap 中,造成Java Heap 的内存泄漏。

1、什么需要释放? 
什么需要什么呢 ? JNI 基本数据类型是不需要释放的 , 如 jint , jlong , jchar 等等 。 我们需要释放是引用数据类型,当然也包括数组家族。如:jstring ,jobject ,jobjectArray,jintArray 等等。

当然,大家可能经常忽略掉的是 jclass ,jmethodID , 这些也是需要释放的哦



2、如何去释放?
1)      释放String

jstring jstr = NULL;

char* cstr = NULL;

//调用方法

jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, getName);

cstr = (char*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0);

__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "getName  ---- >  %s",cstr );

//释放资源

(*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr);

(*jniEnv)->DeleteLocalRef(jniEnv, jstr);

2)      释放 类 、对象、方法

(*jniEnv)->DeleteLocalRef(jniEnv, XXX);



“XXX” 代表 引用对象

3)      释放 数组家族

jobjectArray arrays = NULL;



jclass jclsStr = NULL;



jclsStr = (*jniEnv)->FindClass(jniEnv, "java/lang/String");



arrays = (*jniEnv)->NewObjectArray(jniEnv, len, jclsStr, 0);



(*jniEnv)->DeleteLocalRef(jniEnv, jclsStr);  //释放String类



(*jniEnv)->DeleteLocalRef(jniEnv, arrays); //释放jobjectArray数组



  



native method 调用 DeleteLocalRef() 释放某个 JNI Local Reference 时,首先通过指针 p 定位相应的 Local Reference 在 Local Ref 表中的位置,然后从 Local Ref 表中删除该 Local Reference,也就取消了对相应 Java 对象的引用(Ref count 减 1)。
分享到:
评论

相关推荐

    Aptana studio 安装完启动时中出现Failed to load the JNI shared library

    Aptana studio 安装完启动时中出现Failed to load the JNI shared library如何解决?

    jni.zip jni编译jni下载

    学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义

    jni资源,jni资源合计

    jni资源,jni资源合计 相关地址

    JNIDemo代码资源

    一个简单的根据bci通讯协议编写的jni Demo

    JNI的两个头文件jni.h和jni_md.h

    JNI的两个头文件jni.h和jni_md.h,提供需要的人下载!!!!!

    JNI之Hello-JNI进阶

    LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) 在根目录下运行:ndk-build xxx@xion-driver:~/android_env/eclipse/Workspace/HelloJni$ndk-build Install : ...

    JNI资料大全JNI资料大全

    JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全

    DELPHI开发JNI必备 jni.pas

    DELPHI开发JNI必备 jni.pas 包含文件 jni.pas JNI_MD.INC

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    问题描述: 在开发项目过程中,需要处理算法分析出来二进制流数据,并对数据解析处理转发。我们上层应用平台是使用java开发的,但开放平台是使用c++开发,虽提供给我们对应的.h头文件,但在java中来解析这些数据就...

    jni.h文件.7z

    jni.h文件jni.h文件jni.h文件jni.h文件jni.h文件jni.h文件

    JNI 静态注册 so 和 IDA 导入的 JNI.h 文件.zip

    JNI 静态注册 so 和 IDA 导入的 JNI.h 文件

    JNI完全技术手册 带完整书签

    11、实例十一:在jni中的返回值问题... 65 12、实例十二:在jni中创建java类对象:... 66 Chap10:在 Windows 中实现 Java 本地方法... 66 1.Java 调用 C. 67 2.调试... 76 3.其他信息... 79 Chap11:如何在C/...

    JNI编程指南书

    本书介绍了JNI的设计思想,对这种思想的理解是使用JNI的各种特性的基础。 本书有一部分是JAVA2平台上面的JNI特征的规范说明。JNI程序员可以把这部分用作一个手册。JVM开发者在实现虚拟机的时候必须遵守这些规范。 ...

    jni.h头文件

    学习JNI编译时,缺少的jni.h和jni_md.h头文件

    eclipse启动出现“failed to load the jni shared library”问题解决

    主要介绍了eclipse启动出现“failed to load the jni shared library”问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JNI编程指南与规范.zip

    JNI程序员指南与规范.pdf + 06 JNI编程指南.pdf NDK开发汇总 https://blog.csdn.net/baopengjian/article/details/104615972 THIS book covers the Java™ Native Interface (JNI). It will be useful to you if ...

    jni-example.zip

    在工程目录下面的Android.mk文件中的:LOCAL_JNI_SHARED_LIBRARIES := libjni_example 与jni目录下面的Android.mk文件中的LOCAL_MODULE:= libjni_example 一定要一致(前缀lib都要加上),不然会出现错误。...

    JNI编程指南-书签版

    从网上找的JNI编程指南,但是没有书签,为了方便自己看就添加了书签。JNI 是 JAVA 平台的一个重要特征, 使用它我们可以至用以前用 C/C++写的大量代码。本书 既是一个编程指南也是一个 JNI 手册。本书共包括三部分...

    JNI学习资料(包括JAVA初级教程 j-jni.zip JNI.pdf jni(1).pdf )

    自己收集的JNI学习资料(包括JAVA初级教程 j-jni.zip JNI.pdf jni(1).pdf ), 个人认为内容很全,尤其是j-jni.zip 里面是IBM的在线教程,非常实用,理论例子都很全,是JNI学习的入门帮手.

    jni操作arraylist对象

    在jni中操作arraylist对象,然后添加一个int型数据进去

Global site tag (gtag.js) - Google Analytics