JNI资源释放

因为Native层资源是不被GC回收的,我们要手动释放。

  1. 有哪些资源需要释放呢?
  2. 释放之后怎么确认释放了呢?

引用型对象需要释放,包括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, "", "()V");
jobject obj_hashmap = env->NewObject(class_hashmap, hashmap_construct_method, "");
//如果你要返回obj_hashmap则不需要释放
env->DeleteLocalRef(obj_hashmap);
env->DeleteLocalRef(class_hashmap);

把局部对象分配成全局变量再释放

static jobject callbackObj;
void Java_com_example_start(JNIEnv *env, jobject obj, jobject callback)
{
    callbackObj = env->NewGlobalRef(callback);
}
//在释放方法里调用
env->DeleteGlobalRef(callbackObj);

我看到别人的博客说,jmethodID也是需要释放的,我测试结果是不能释放的

查看native层内存
使用命令行
adb shell dumpsys meminfo packageName/pid

Native Heap 就是需要关注的内存

你可能感兴趣的:(JNI资源释放)