因为Native层资源是不被GC回收的,我们要手动释放。
- 有哪些资源需要释放呢?
- 释放之后怎么确认释放了呢?
引用型对象需要释放,包括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);
把局部对象分配成全局变量再释放
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 就是需要关注的内存