Android JNI开发(3)--引用类型
来源:互联网 发布:大数据 涂子沛 下载 编辑:程序博客网 时间:2024/06/07 02:00
NDK开发中的引用类型分为三种:局部引用(Local Reference)、全局引用(Global Reference)、弱全局引用(Weak Global Reference)
1、 局部引用
通过NewLocalRef和各种JNI接口创建(FindClass、NewObject、GetObjectClass和NewCharArray等)。会阻止GC回收所引用的对象,不能跨函数使用,不能跨线程使用。函数返回后局部引用所引用的对象会被JVM自动释放,或调用DeleteLocalRef主动释放。
以下几种局部引用的创建方式:
jclass cls_string = (*env)->FindClass(env, "java/lang/String");jcharArray charArr = (*env)->NewCharArray(env, len);jstring str_obj = (*env)->NewObject(env, cls_string, cid_string, elemArray);jstring str_obj_local_ref = (*env)->NewLocalRef(env,str_obj); // 通过NewLocalRef函数创建等
主动删除一个局部引用调用DeleteLocalRef,如下:
(*env)->DeleteLocalRef(env,object);
我们不可以使用static来修饰局部引用,让它下次使用,这样会造成野指针。
2、全局引用
调用NewGlobalRef基于局部引用创建,会阻GC回收所引用的对象。可以跨方法、跨线程使用。JVM不会自动释放,必须调用DeleteGlobalRef手动释放(*env)->DeleteGlobalRef(env,object);
jclass localclazzjclass globalclazz……localclazz = (*env)->FindClass(env,"java/lang/String");//局部globalclazz = (*env)->NewGlobalRef(env,localclazz );//将布局引用的对象转成全局的引用对象……(*env)->DeleteLocalRef(env,localclazz );//需要主动删除全局应用
3、弱全局引用
调用NewWeakGlobalRef基于局部引用或全局引用创建,不会阻止GC回收所引用的对象,可以跨方法、跨线程使用。引用不会自动释放,在JVM认为应该回收它的时候(比如内存紧张的时候)进行回收而被释放。或调用DeleteWeakGlobalRef手动释放。(*env)->DeleteWeakGlobalRef(env,object)
jclass cls_string = (*env)->FindClass(env, "java/lang/String");g_cls_string = (*env)->NewWeakGlobalRef(env,cls_string);//基于局部引用创建弱全局引用
我们不知道弱引用是否一应被回收,所以需要判断一下有效性:
可以使用IsSameObject函数检验一个弱全局引用是否仍然指向活动的类实例,例如:
if(JNI_FALSE == (*env)->IsSameObject(env,weakGlobalClazz,NULL)){/*对象仍然处于活动状态且可以使用*/}else{/*对象被垃圾回收期收回,不能使用*/}
当然这个方法,也可以判断两个引用(局部、全局、弱全局)是否指向同一个对象,方法为:
(*env)->IsSameObject(env, obj1, obj2)
如果obj1和obj2指向相同的对象,则返回JNI_TRUE(或者1),否则返回JNI_FALSE(或者0)。
- Android JNI开发(3)--引用类型
- Android jni/ndk编程四:jni引用类型
- Android JNI开发摘录(五)之对象引用处理
- Android NDK 开发(四)JNI 中局部引用、全局引用和弱全局引用
- Android Stuido Ndk-Jni 开发(四):Jni打包及引用aar
- Android Stuido Ndk-Jni 开发(四)Jni打包及引用aar
- Android开发--JNI基础类型详解
- android JNI java与C++传递String数组(引用类型)
- Android jni开发-3(jni函数详解)
- Android NDK(六):JNI局部引用和全局引用
- Android NDK(JNI)开发
- Android JNI开发(一)
- Android JNI 类型转换
- Android JNI 类型转换
- JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用
- NDK开发学习笔记(3):JNI访问数组、引用、异常处理、缓存策略
- Android JNI局部引用表
- Android Studio3.0开发JNI流程------JNI的类型和数据结构
- Android Error in Eclipse: “Unable to execute dex: Cannot merge new index 66904 into a non-jumbo inst
- java互联网架构-Mybatis缓存机制
- 解决struts2以GET方式提交表单中文乱码问题
- 第二周 项目3 汉诺塔程序
- leetcode 200. Number of Islands DFS深度优先遍历
- Android JNI开发(3)--引用类型
- struts2架构中核心对象的探索—— ActionContextClearUp
- 数据库中Any和All区别
- hexo建站详解----jade 。swig。ejs模板使用 hexo favicon设置
- Websocket(一)简单的demo实现
- Caused by:Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
- swiper 定位到指定页面或位置
- Nginx学习总结(10)——Nginx前后端分离将多个请求转发到多个Tomcat,负载均衡反向代理
- SQL注入思路与手工猜解