Android NDK学习笔记5:引用类型管理
转载请标明出处: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:引用类型管理相关推荐
- Android NDK学习笔记1:基础
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119005718 本文出自[赵彦军的博客] 文章目录 (一)什么是Android N ...
- Android NDK学习笔记(转)
前言 Android系统中的应用程序都是用Java开发的.Android NDK使我们能够在android上使用C/C++开发的原生代码.有两个理由使用NDK: 一是合理的重用现有的代码:二是在程序中 ...
- Android NDK学习笔记3:JNI访问Java属性、方法
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119209444 本文出自[赵彦军的博客] 文章目录 Java 类型和JNI符号对比 ...
- Android NDK学习笔记6:异常处理
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119547007 本文出自[赵彦军的博客] 文章目录 JNI捕获异常 JNI抛出异常 ...
- Android NDK学习笔记4:JNI访问Java构造函数
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119348263 本文出自[赵彦军的博客] 文章目录 方式一:NewObject 方 ...
- Android NDK学习笔记2:数组
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119152933 本文出自[赵彦军的博客] 文章目录 java数组和jni数组对应关 ...
- NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM(方法签名,CallXXXMethod)
NDK学习笔记:JNI调用Java层方法创建Native的AudioTrack播放PCM 题目有点复杂,不过确实就是那么回事.这章想记录的内容比较多,先列出来: native static 与 nat ...
- Android 开发学习笔记:七大知识点板块汇总
前言 我从事 Android 开发行业也有些年头,工作期间也接触过很多 Android 开发者, 因此也非常清楚 程序员最大的限制并非年龄而是实力: 但大多数初中级Android工程师,想要提升技能, ...
- Android:日常学习笔记(8)———探究UI开发(2)
Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...
最新文章
- Mysql笔记——DML
- 【翻译】在Ext JS和Sencha Touch中创建自己定义布局
- 使用 CliWrap 让C#中的命令行交互举重若轻
- Android之严苛模式(StrictMode)
- icoding复习7, 8
- BOMbing The System
- 多任务 schedule python_Python3.6 Schedule 模块定时任务 (实例讲解)
- 云服务器 自有操作系统,云服务器 自有操作系统
- python核心编程笔记--chapter2
- 真香警告!java时间格式转换工具
- 微信公证号授权给微信开放平台(第三方平台)开发流程 PHP (基于laravel框架开发)
- 开源交通仿真平台SimMobility的安装教程
- 编译出错 Resource temporarily unavailable
- vue路由模板是html,vue-router 详解
- BC26 计算三角形的周长和面积(海伦公式)
- 为什么人生病了就要静养呢?
- 微信小程序canvas画图案列,实现生成头像并保存,小程序新版canvas变化,小程序中canvas注意事项
- 3 MySQL数据管理
- 【WSL】window10 安装WSL2配置conda环境及深度学习环境搭建
- (xi,yi,zi ) (xj , yj , zj) 的对数
热门文章
- 学计算机对显卡要求大吗,【5人回答】学AE的电脑配置要求高吗?需要什么样的电脑配置-3D溜溜网...
- 无线路由器dns服务器不能用,DNS服务器不可用
- 随机手机号码_骗妹子手机号码,还记得iPhone自带计算器的小魔术吗?,看教程...
- 用python画动态皮卡丘_利用Python绘制萌萌哒的皮卡丘
- 总结Python机器学习中的回归算法
- 七、深入JavaScript的DOM(三)
- 40万总奖金!顶级云服务免费用!2021全球高性能云计算创新大赛报名中!
- 复旦大学邱锡鹏教授团队:Transformer最新综述
- Transformer升级之路:博采众长的旋转式位置编码
- BP反向传播矩阵推导图示详解​