在NDK中jmethodID需要释放吗?我看了一下资料,说jclass和jbyteArray及jstring都需要用DeleteLocalRef来释放,DeleteLocalRef的参数是jobject,但jmethodID的基类不是jobject,那它需要释放吗?
解决方案 »
- android 如何让view 放大,本身内容也放大
- 为什么ArrayList的add函数不仅增加一个数据,还把先前加的记录都改为和新加的数据?
- 基于Rexsee项目中心的在线开发实现hello World,含代码
- logcat抓到标签为SkLayout_wtle的log:E/SkLayout_wtle(53):ellipsis failed linenumber 1 0
- android程序无法运行!!快崩溃啦
- android 获取外部activity返回值
- eclipse调试 步进经常跟进到Android.jar或者DexFile.class文件怎么办?
- Android能否实现http透明代理
- webview的cookie问题
- 安卓开发中文件的删除
- 谁有可以正常下载的SDK包啊,还有ADT啊 。。
- android环境配置出现问题。。。。
什么需要什么呢 ? JNI 基本数据类型是不需要释放的 , 如 jint , jlong , jchar 等等 。 我们需要释放是引用数据类型,当然也包括数组家族。如:jstring ,jobject ,jobjectArray,jintArray 等等。 当然,大家可能经常忽略掉的是 jclass ,jmethodID , 这些也是需要释放的哦
(jmethodID)env->NewGlobalRef(env->GetMethodID(h264StreamCls, "getSPSNalu", "()[B"));
是编译不过的,jmethodid 非jobject。
但也并不是说jmethodid就不能全局引用。
把env->GetMethodID(h264StreamCls, "getSPSNalu", "()[B"); 返回的jmethodid直接复制给一个全局的jmethodid变量,是可以出函数全局是使用的。
这样做的原理是创建一个全局shared_ptr<T> 对象,引用T。弊端就是这将无法释放。不知道JNI设计人员出于何种考虑,这算是jni的一个bug,在android的platform下的jni是有NewGlobalRef(jmethodid)这个重载的。
Last 10 entries in JNI local reference table:
502: 0x4055a668 cls=[B (29428 bytes)
503: 0x4055a668 cls=[B (29428 bytes)
504: 0x4055a668 cls=[B (29428 bytes)
505: 0x4055a668 cls=[B (29428 bytes)
506: 0x4055a668 cls=[B (29428 bytes)
507: 0x4055a668 cls=[B (29428 bytes)
508: 0x4055a668 cls=[B (29428 bytes)
509: 0x4055a668 cls=[B (29428 bytes)
510: 0x4055a668 cls=[B (29428 bytes)
511: 0x4055a668 cls=[B (29428 bytes)
JNI local reference table summary (512 entries):
1 of Ljava/lang/Class; 188B
1 of Ljava/lang/Class; 236B
1 of Lcom/lisa/lm/jni/LisaMedia; 212B
1 of Lcom/lisa/lm/media/record/H264Stream; 132B //以上4个是全局引用,stop时释放。 1 of [B 28B
1 of [B 36B
15 of [B 20020B (1 unique)
1 of [B 23052B
490 of [B 29428B (1 unique)
Memory held directly by tracked refs is 73332 bytes如果是C里调用java,返回数组。
jbyteArray array = (jbyteArray)env->CallObjectMethod(h264StreamObj, getPPSNaluMid);
即使jbyteArray array是在函数内部,是局部变量,也需要手动删除local引用。翻文档总结如下:
对于FindClass 返回的一定需要调用DeleteLocalRef,还有jbyteArray 类型的变量需要DeleteLocalRef。
NewString/ NewStringUTF/NewObject/ GetObjectField生成的需要DeleteLocalRef。
以上返回的类型变量是malloc出来的,不是栈变量。出作用域不会被释放,需要手动。设计的真是令人发指!如下写法是不对的:
SetObjectField(dwi, jfID, env->NewStringUTF(szDateTime))