因?yàn)镹ative層資源是不被GC回收的,我們要手動(dòng)釋放。
- 有哪些資源需要釋放呢纹烹?
- 釋放之后怎么確認(rèn)釋放了呢?
引用型對(duì)象需要釋放召边,包括jstring, jclass, jobject, jbyteArray等等铺呵;從作用域的角度分為兩類:Global and Local References
jstring
void Java_com_example_jni_render(JNIEnv *env, jobject obj, jstring imagePath)
{
const char* image = env->GetStringUTFChars(imagePath, 0);
env->ReleaseStringUTFChars(imagePath, image);
}
//或者
jstring jstring1 = env->NewStringUTF("abc");
env->DeleteLocalRef(jstring1);
jbyteArray
void Java_com_example_jni_detect(JNIEnv *env, jobject obj, jbyteArray imgdata)
{
jbyte *imgByte = env->GetByteArrayElements(imgdata, 0);
env->ReleaseByteArrayElements(imgdata, imgByte, 0);
}
jclass
jclass clsstring = env->FindClass("java/lang/String");
env->DeleteLocalRef(clsstring);
jobject
jclass class_hashmap = env->FindClass("java/util/HashMap");
jmethodID hashmap_construct_method = env->GetMethodID(class_hashmap, "<init>", "()V");
jobject obj_hashmap = env->NewObject(class_hashmap, hashmap_construct_method, "");
//如果你要返回obj_hashmap則不需要釋放
env->DeleteLocalRef(obj_hashmap);
env->DeleteLocalRef(class_hashmap);
把局部對(duì)象分配成全局變量再釋放
static jobject callbackObj;
void Java_com_example_start(JNIEnv *env, jobject obj, jobject callback)
{
callbackObj = env->NewGlobalRef(callback);
}
//在釋放方法里調(diào)用
env->DeleteGlobalRef(callbackObj);
我看到別人的博客說(shuō),jmethodID也是需要釋放的隧熙,我測(cè)試結(jié)果是不能釋放的
查看native層內(nèi)存
使用命令行
adb shell dumpsys meminfo packageName/pid
Native Heap 就是需要關(guān)注的內(nèi)存