JNI資源釋放

因?yàn)镹ative層資源是不被GC回收的,我們要手動(dòng)釋放。

  1. 有哪些資源需要釋放呢?
  2. 釋放之后怎么確認(rèn)釋放了呢?

引用型對(duì)象需要釋放,包括jstring, jclass, jobject, jbyteArray等等;從作用域的角度分為兩類(lèi):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
QQ20171207-141943@2x.png

Native Heap 就是需要關(guān)注的內(nèi)存

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容