JNI手动释放内存(避免内存泄露)

复制代码
1. 哪些需要手动释放?

    不要手动释放(基本类型): jint , jlong , jchar

    需要手动释放(引用类型,数组家族): jstring,jobject ,jobjectArray,jintArray ,jclass ,jmethodID

2. 释放方法
2.1 jstring & char *

// 创建 jstring 和 char*

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

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

// 释放

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

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


2.2 jobject,jobjectArray,jclass ,jmethodID等引用类型

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


2.3 jbyteArray

jbyteArray audioArray = jnienv->NewByteArray(frameSize);

jnienv->DeleteLocalRef(audioArray);


2.4 GetByteArrayElements

jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy);

(*env)->ReleaseByteArrayElements(env,jarray,array,0);


2.5 NewGlobalRef

jobject ref= env->NewGlobalRef(customObj);

env->DeleteGlobalRef(customObj);


3. 避免内存泄露

JNI如果创建以上引用却不手动释放的话很容易就造成内存泄露,所以JNI编程创建的引用类型一定要手动释放(切身教训),检测内存泄露可以使用Jprofiler
复制代码

 

posted @   brave-sailor  阅读(7553)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2016-03-28 通过layout实现可拖拽自动排序的UICollectionView
2016-03-28 Swift2.0下UICollectionViews拖拽效果的实现
2016-03-28 Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
2016-03-28 Swift基础--手势识别(双击、捏、旋转、拖动、划动、长按)
2015-03-28 java实现 阿拉伯数字转换为汉字数字 算法
2015-03-28 Android TextView 实现文字大小不同和文字颜色不同
2015-03-28 解决Android中TextView首行缩进的问题
点击右上角即可分享
微信分享提示