JNI中的引用意在告知虚拟机何时回收一个JNI变量

JNI引用变量分为局部引用和全局引用

局部引用

局部引用,通过DeletLocalRef手动释放对象

原因

  • 访问一个很大的Java对象,使用之后还用进行复杂的耗时操作
  • 创建了大量的局部引用,占用了太多的内存,而且这些局部引用跟后面的操作没有关联性

局部引用示例

Java中存在native方法

public native void localRef();

在native中有调用对象,但对象在使用以后就不再使用,此时就可以将对象释放掉,以节约内存
此处举一个循环创建数组的,数组中建立对象的例子

JNIEXPORT void JNICALL Java_com_cj5785_jni_JniTest_localRef
(JNIEnv *env, jobject jobj)
{int i = 0;for (;i < 10; i++){//创建Date对象jclass cls = (*env)->FindClass(env, "java/util/Date");jmethodID constructor_mid = (*env)->GetMethodID(env, cls, "<init>", "()V");jobject obj = (*env)->NewObject(env, cls, constructor_mid);//使用完毕,通知垃圾回收器回收对象(*env)->DeleteLocalRef(env, obj);printf("已通知垃圾回收器回收对象\n");}
}

全局引用

共享(可以跨多个线程),手动控制内存使用
此处通过创建一个字符串来说明,native中存在一个全局变量jstring global_str;

创建

Java

public native void createGlobalRef();

C

JNIEXPORT void JNICALL Java_com_cj5785_jni_JniTest_createGlobalRef
(JNIEnv *env, jobject jobj)
{jstring lobj = (*env)->NewStringUTF(env, "jni golbal test");global_str = (*env)->NewGlobalRef(env, lobj);
}

获取

Java

public native String getGlobalRef();

C

JNIEXPORT jstring JNICALL Java_com_cj5785_jni_JniTest_getGlobalRef
(JNIEnv *env, jobject jobj)
{return global_str;
}

释放

Java

public native void deleteGlobalRef();

C

JNIEXPORT void JNICALL Java_com_cj5785_jni_JniTest_deleteGlobalRef
(JNIEnv *env, jobject jobj)
{(*env)->DeleteGlobalRef(env, global_str);
}

弱全局引用

节省内存,在内存不足时,可以释放所引用的对象
可以引用一个不常用的对象,如果为NULL,临时创建
创建:NewWeakGlobalRef
销毁:DeleteGlobalWeakRef

转载于:https://www.cnblogs.com/cj5785/p/10664678.html

NDK学习笔记-JNI的引用相关推荐

  1. NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM(方法签名,CallXXXMethod)

    NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM 题目有点复杂,不过确实就是那么回事.这章想记录的内容比较多,先列出来: native static 与 nat ...

  2. NDK学习笔记:一起来变萝莉音!FMOD学习总结(下)

    NDK学习笔记:一起来变萝莉音!FMOD学习总结(下) 一.创建自己的变音demo 上一节我已经能够在AndroidStudio上跑起了fmod的基础教程.还有疑问的同学可以重新阅读跟着来跑一次.这章 ...

  3. NDK学习笔记:FFmpeg音视频同步3(你追我赶,升级ffmpeg/libyuv支持neon)

    NDK学习笔记:FFmpeg音视频同步3 本篇内容说多不多,但如果要说得明明白白的,可能就有点难度了.所以我决定把我的调试过程日志都呈现出来,方便大家理解.继上一篇文末,我们学习到了什么是DTS/PT ...

  4. NDK学习笔记:FFmpeg解压MP34提取音频PCM(swrContext、swr_alloc_set_opts)

    NDK学习笔记:FFmpeg解压MP34提取音频PCM 承接 FFmpeg解压MP4提取视频YUV ,这次我们需要提取的是音频原始数据PCM.代码流程大同小异,主要区别就是AVFrame->PC ...

  5. NDK学习笔记:RtmpPusher之利用rtmpdump推h264/aac码流

    NDK学习笔记:RtmpPusher之利用rtmpdump推h264/aac码流 本篇将是 RtmpPusher 的最后一篇.在之前的3篇文章里,我们已经把原生的视频YUV格式编码成h264,把音频的 ...

  6. ndk学习20: jni之OnLoad动态注册函数

    一.原理 当在系统中调用System.loadLibrary函数时,该函数会找到对应的动态库, 然后首先试图找到"JNI_OnLoad"函数,如果该函数存在,则调用它 JNI_On ...

  7. Android NDK学习笔记1:基础

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119005718 本文出自[赵彦军的博客] 文章目录 (一)什么是Android N ...

  8. Android NDK学习笔记6:异常处理

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119547007 本文出自[赵彦军的博客] 文章目录 JNI捕获异常 JNI抛出异常 ...

  9. Android NDK学习:JNI中的数组、引用和异常的处理

    JNI的文档 https://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html JNI数组操作 调用数组 Java ...

最新文章

  1. tesseract 识别中文字符
  2. 你真的了解try{ return }finally{}中的return?
  3. 通信原理中的几个重要概念
  4. C语言之动态内存管理与动态内存函数
  5. python字典添加主键_python 字典相关操作
  6. springcloud(十一):服务网关Zuul高级篇
  7. quart动态执行定时任务
  8. Visual Studio 2008 Beta 2 VPC寿命延长
  9. 关于内存的划分和传引用传参数的区别
  10. Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程
  11. couchbase_适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...
  12. 软中断和硬中断的区别
  13. system health_Health Hack 2014:开源,开放数据和跨学科协作的力量
  14. 数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes
  15. 华为acl怎么生效_华为ACL配置教程
  16. 微信卡死代码 java_微信整人代码有哪些 微信卡死的代码是什么
  17. vb从入门到精通_干货|让你 ArcGIS Engine从入门到精通的22个视频
  18. HVIDB!人类病毒蛋白互作数据库介绍
  19. 小米6不显示与电脑连接到服务器,小米6怎么连接不上电脑没反应怎么办
  20. html5不用reload重置网页,refresh和reload

热门文章

  1. C# 语法练习(4): 类型转换
  2. Nginx的启动、停止和重启
  3. 类中的构造方法实例化的时候自动执行
  4. 深入理解计算机系统(4.2)---硬件的魅力
  5. zookeeper运维管理
  6. 【转】Windows8不联网直接安装.Net 3.5 Framework的方法
  7. 【bzoj2006】【NOI2015】超级钢琴
  8. Android 7.1.1 去感叹号
  9. 解决Jenkins的job启动tomcat时会在job结束时关闭问题
  10. Java中Volatile的理解