转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119545225
本文出自【赵彦军的博客】

文章目录

  • 局部引用
  • 全局引用
  • 弱引用
  • 总结

在 JNI 中,有三种引用类型

  • 全局引用
  • 局部引用
  • 弱引用

局部引用

在方法中定义的局部引用,可以不用手动释放,在程序运行结束后,会自动释放。但是有一种情况,比如在方法中有 for 循环,如果产生大量的局部引用,会占用大量内存。所以一种比较好的编程习惯就是,产生的局部变量,一旦不再使用,就手动释放一下。

void DeleteLocalRef(jobject localRef)

举例说明:

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {jstring str = env->NewStringUTF("string");//释放局部变量env->DeleteLocalRef(str);
}

全局引用

顾名思义,全局引用就是生命周期特别长,方法结束后不会自动释放内存。

创建全局变量:

jobject NewGlobalRef(jobject obj)

举个例子:

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {static jclass strClass = nullptr;if (strClass == nullptr) {//创建局部变量jclass cls = env->FindClass("java/lang/String");//全局引用赋值strClass = static_cast<jclass>(env->NewGlobalRef(cls));//释放局部引用env->DeleteLocalRef(cls);} else {//使用全局变量}
}

需要注意的是 ,static 不能修饰局部变量,因为局部变量在程序退出的时候,会自动释放。那么 static 修饰的变量就变成了野指针。

释放全局引用

void DeleteGlobalRef(jobject globalRef)

举例说明:

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {static jclass strClass = nullptr;if (strClass == nullptr) {//创建局部变量jclass cls = env->FindClass("java/lang/String");//全局引用赋值strClass = static_cast<jclass>(env->NewGlobalRef(cls));//释放局部引用env->DeleteLocalRef(cls);} else {//使用全局变量}//释放全局引用env->DeleteGlobalRef(strClass);
}

弱引用

弱引用的定义和java 弱引用的定义是一样的。
全局引用不会被 GC , 但是弱引用会在内存不足的情况下,被GC。所以在使用 弱引用之前要判断一下该引用是否被GC 。

判断方法:

jboolean IsSameObject(jobject ref1, jobject ref2)

举例说明:

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {static jclass strClass = nullptr;if (strClass == nullptr) {//创建局部变量jclass cls = env->FindClass("java/lang/String");//弱引用赋值strClass = static_cast<jclass>(env->NewWeakGlobalRef(cls));//释放局部引用env->DeleteLocalRef(cls);} else {}//判断是否被GCbool isGC = env->IsSameObject(strClass, nullptr);if (isGC) {//弱引用被回收了} else {//弱引用没有被回收}//释放全局引用env->DeleteWeakGlobalRef(strClass);
}

总结

  • 1、全局引用可以做缓存,对象复用。可以避免频繁的创建对象
  • 2、弱引用会在内存不足的情况下被回收,所以弱引用在使用之前要判断是否为 Null
  • 3、局部引用会在方法结束时自动释放,如果有循环频繁创建局部引用,会占用大量内存,需要手动释放

Android NDK学习笔记5:引用类型管理相关推荐

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

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

  2. Android NDK学习笔记(转)

    前言 Android系统中的应用程序都是用Java开发的.Android NDK使我们能够在android上使用C/C++开发的原生代码.有两个理由使用NDK: 一是合理的重用现有的代码:二是在程序中 ...

  3. Android NDK学习笔记3:JNI访问Java属性、方法

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119209444 本文出自[赵彦军的博客] 文章目录 Java 类型和JNI符号对比 ...

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

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

  5. Android NDK学习笔记4:JNI访问Java构造函数

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119348263 本文出自[赵彦军的博客] 文章目录 方式一:NewObject 方 ...

  6. Android NDK学习笔记2:数组

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119152933 本文出自[赵彦军的博客] 文章目录 java数组和jni数组对应关 ...

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

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

  8. Android 开发学习笔记:七大知识点板块汇总

    前言 我从事 Android 开发行业也有些年头,工作期间也接触过很多 Android 开发者, 因此也非常清楚 程序员最大的限制并非年龄而是实力: 但大多数初中级Android工程师,想要提升技能, ...

  9. Android:日常学习笔记(8)———探究UI开发(2)

    Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...

最新文章

  1. Mysql笔记——DML
  2. 【翻译】在Ext JS和Sencha Touch中创建自己定义布局
  3. 使用 CliWrap 让C#中的命令行交互举重若轻
  4. Android之严苛模式(StrictMode)
  5. icoding复习7, 8
  6. BOMbing The System
  7. 多任务 schedule python_Python3.6 Schedule 模块定时任务 (实例讲解)
  8. 云服务器 自有操作系统,云服务器 自有操作系统
  9. python核心编程笔记--chapter2
  10. 真香警告!java时间格式转换工具
  11. 微信公证号授权给微信开放平台(第三方平台)开发流程 PHP (基于laravel框架开发)
  12. 开源交通仿真平台SimMobility的安装教程
  13. 编译出错 Resource temporarily unavailable
  14. vue路由模板是html,vue-router 详解
  15. BC26 计算三角形的周长和面积(海伦公式)
  16. 为什么人生病了就要静养呢?
  17. 微信小程序canvas画图案列,实现生成头像并保存,小程序新版canvas变化,小程序中canvas注意事项
  18. 3 MySQL数据管理
  19. 【WSL】window10 安装WSL2配置conda环境及深度学习环境搭建
  20. (xi,yi,zi ) (xj , yj , zj) 的对数

热门文章

  1. 学计算机对显卡要求大吗,【5人回答】学AE的电脑配置要求高吗?需要什么样的电脑配置-3D溜溜网...
  2. 无线路由器dns服务器不能用,DNS服务器不可用
  3. 随机手机号码_骗妹子手机号码,还记得iPhone自带计算器的小魔术吗?,看教程...
  4. 用python画动态皮卡丘_利用Python绘制萌萌哒的皮卡丘
  5. 总结Python机器学习中的回归算法
  6. 七、深入JavaScript的DOM(三)
  7. 40万总奖金!顶级云服务免费用!2021全球高性能云计算创新大赛报名中!
  8. 复旦大学邱锡鹏教授团队:Transformer最新综述
  9. Transformer升级之路:博采众长的旋转式位置编码
  10. BP反向传播矩阵推导图示详解​