美文网首页
JNI资源释放

JNI资源释放

作者: 跟跟_a5e9 | 来源:发表于2017-12-07 14:23 被阅读0次

因为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, "<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
QQ20171207-141943@2x.png

Native Heap 就是需要关注的内存

相关文章

  • JNI资源释放

    因为Native层资源是不被GC回收的,我们要手动释放。 有哪些资源需要释放呢? 释放之后怎么确认释放了呢? 引用...

  • Android JNI开发--资源释放问题

    最近又在开发JNI相关的项目了。本来一切正常,坐等测试完毕发布版本,然而理想是美好的,现实是骨感的。测试跑过来跟我...

  • 释放资源

    很久以前,有位老师告诉我,读一本烂书最大的浪费不是买书的花费(尽管相比国外,我们的的书实际上是最便宜的,但我们还是...

  • Zygote工作流程

    Zygote的作用 1)启动SystemServer(使用zygote的资源:常用类,JNI函数,主题资源,共享库...

  • ios 资源释放

    系统级资源(对象)ARC后 大部分代码不需要手动释放,但有些还是需要自己去手动释放的。如众所周知的NSTimer、...

  • 线程中sleep()和wait()有何区别,各有什么含义 ?

    区别: (1)sleep()不会释放资源,wait()会释放资源; (2)sleep()是Thread类里的函数,...

  • Bitmap

    获取Bitmap大小 Bitmap优化 一、主动释放Bitmap资源 二、主动释放ImageView的图片资源 三...

  • php也要手动释放资源

    由于PHP会在处理完一个请求之后会释放所有系统资源,从而会有很多人认为PHP不需要手动释放资源,释放资源的事PHP...

  • 资源管理

    及时释放资源对象 如果不及时释放资源,则资源一直被占用,浪费内存不说,在下次垃圾回收前,此资源也不能被再次访问 静...

  • AQS独占资源- release

    独占释放资源( release(int i) ) 此方法是acquire()的反操作,是独占模式下线程释放共享资源...

网友评论

      本文标题:JNI资源释放

      本文链接:https://www.haomeiwen.com/subject/riddixtx.html