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

jni内存释放

 
阅读更多
调用GetStringUTFChars,GetDoubleArrayElements等相关方法时,用完之后需要对应调用ReleaseStringUTFChars,ReleaseDoubleArrayElements

调用GetObjectArrayElement不需要释放,但用完需要调用DeleteLocalRef删除对应局部引用


jstring tempObj = (jstring)env->GetObjectArrayElement(array, j);
env->DeleteLocalRef(tempObj);

jobjectArray args =(env)->NewObjectArray(nCount,(env)->FindClass("java/lang/String"),0);

args 一般作为返回值使用,此时不需要删除引用。如果只是在jni层使用,不作为返回值,则需要删除。 NewStringUTF与NewObjectArray情况类似。

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)     释放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)     释放 数组家族
jobjectArrayarrays = 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)

DeleteGlobalRef() 删除 Global reference 和它引用的 Java 对象。Global reference 管理不当会导致 Java Heap 的内存泄漏
分享到:
评论

相关推荐

    jni层内存泄漏检测工具

    JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...

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

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

    jni.zip jni编译jni下载

    在实际开发中,还需要注意一些细节,比如错误处理、内存管理(Java对象在本地代码中使用需要通过JNI函数创建和释放)、线程安全问题等。同时,由于涉及到跨语言和跨平台,理解JNI的工作原理和正确使用JNI头文件至关...

    DELPHI开发JNI必备 jni.pas

    5. **内存管理**:JNI提供了在Java和本地代码之间管理内存的机制,如NewGlobalRef、DeleteLocalRef等,以避免内存泄漏。 6. **字符串和转换**:JNI提供了将Java字符串转换为本地字符串,以及反之的转换函数,方便...

    java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码

    在Java中,我们可以使用Java Native Interface(JNI)来调用Windows API,获得系统的内存信息和CPU使用率。我们可以使用GetSystemInfo函数来获得系统的内存信息,包括物理内存的大小、可用内存的大小和页面文件的...

    jni传递对象数组

    JNI,全称Java Native ...在实际开发中,理解JNI的工作原理和正确管理内存至关重要,以避免可能出现的内存泄漏和异常。同时,需要注意的是,频繁的JNI调用会增加应用程序的复杂性,并可能影响性能,因此应当适度使用。

    jni.h文件.7z

    编写JNI代码时,开发者需要遵循一些规则,比如如何处理异常,如何管理内存,以及如何正确地与Java对象交互。JNI提供了一套完整的机制来安全地跨越Java和本地代码之间的边界。 总结来说,`jni.h`是JNI的核心,它定义...

    JNI处理hashmap,string等对象的操作

    注意,由于JNI操作不自动管理内存,所以在完成操作后,必须确保正确地释放任何分配的资源。 对于其他类型的对象,如自定义类实例,你需要为它们定义Java层的本地方法签名,然后在C/C++代码中使用`FindClass`找到...

    jni操作list集合,来存储对象

    JNI操作Java对象时需要注意内存管理。创建的Java对象需要手动释放,否则可能导致内存泄漏。使用`env->DeleteLocalRef`释放不再使用的本地引用。 6. **异常处理**: JNI调用Java方法时可能会抛出异常,需要通过`...

    JNI技术各类文档

    - **内存管理**:Java和本地代码间的内存分配和释放策略。 - **线程安全**:在多线程环境中使用JNI的注意事项。 - **错误处理和调试**:如何定位和修复JNI相关的错误,以及有效的调试技巧。 3. **JNI技术手册** ...

    传智播客_Andorid_JNI视频_day01视频

    在JNI中分配的内存必须在JNI中释放,避免内存泄漏。 7. **错误处理**:在JNI编程中,错误处理非常重要,因为错误通常不会像Java那样抛出异常,而是通过返回值或全局错误状态来指示。 8. **线程安全**:如果JNI方法...

    Android 5.0jni调用

    Android 5.0引入了更快、更可靠的释放机制,允许直接在JNI代码中释放本地资源。 5. **静态字段访问**:压缩包中的`JniUseStaticField`可能是一个示例,展示了如何在JNI中访问Java类的静态字段。在JNI中,可以通过`...

    android jni 里面使用NewGlobalRef

    总的来说,理解并正确使用JNI中的引用管理对于避免内存泄漏和程序崩溃至关重要。全局引用虽然提供了更大的灵活性,但也需要开发者谨慎管理,以确保资源的正确释放。在Android开发中,熟悉这些原生和Java之间的交互...

    java高级jni教程

    7. **内存管理**:本地代码分配的内存需要手动释放,而Java对象则由垃圾回收器自动管理。因此,正确地管理内存分配和释放是避免内存泄漏的关键。 8. **性能优化**:JNI常用于性能敏感的场景,如图形处理、数据库...

    JAVA中jni使用

    在本地代码中分配的内存需要在本地代码中释放,反之亦然。此外,JNI提供了引用计数机制,用于管理Java对象在本地代码中的生命周期。 7. **错误处理和调试**: JNI编程中,错误处理至关重要。由于本地代码和Java...

    JNI编程指南

    7. 内存管理:本地代码和Java虚拟机共享内存空间,JNI提供了函数来进行内存分配、复制、释放等操作。正确管理内存是避免内存泄漏和不稳定的重要环节。 8. 本地方法的声明与实现:本地方法需要在Java类中声明,并且...

    jni数据传递demo

    JNI中的内存管理需要注意,本地引用(Local Refs)在JNI函数返回时自动释放,全局引用(Global Refs)不会自动释放,需要手动调用`DeleteGlobalRef`。弱全局引用(Weak Global Refs)类似,但不阻止对象被垃圾回收...

    JNI程序员指南与规范_liono8x_jni指南_

    10. **内存管理**:JNI中使用`NewObject`、`NewString`等创建的Java对象需要在适当的时候释放,避免内存泄漏。`DeleteLocalRef`用于释放局部引用,`DeleteGlobalRef`和`DeleteWeakGlobalRef`用于释放全局引用和弱...

    java传送json到jni,jni传送json到java

    JNI中的内存管理不同于Java,需要手动分配和释放内存。避免内存泄漏,尤其是在处理字符串和大对象时。 综上所述,Java Activity通过JNI与本地代码进行JSON数据交换涉及到序列化/反序列化、JNI接口定义、本地代码...

Global site tag (gtag.js) - Google Analytics