博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNI引用
阅读量:6458 次
发布时间:2019-06-23

本文共 1509 字,大约阅读时间需要 5 分钟。

引用的类型:局部引用、全局引用和 弱全局引用

对于JNI引用类型可以参考这篇文章

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

局部引用

局部引用:通过NewLocalRef和各种JNI接口创建(FindClass、NewObject、GetObjectClass和NewCharArray等)。局部引用会在C/C++代码执行完成之后自动释放(可以回收)。 但是,有时候我们需要手动去释放(调用DeleteLocalRef释放): 1、访问一个很大的Java对象,使用完之后,还要进行复杂的耗时操作 2、创建了大量的局部引用,占用了太多的内存,而且这些布局引用跟后面的操作没有关联性

jclass cls = (*env)->FindClass(env, "java/util/Date");	jmethodID constructor_mid = (*env)->GetMethodID(env, cls, "
", "()V"); //实例化Date对象 jobject obj = (*env)->NewObject(env, cls, constructor_mid); //Date对象数组 jobjectArray jobj_arr = (*env)->NewObjectArray(env, 5, cls, obj); //提前释放,不要占用内存太久 //告诉虚拟机垃圾回收器,可以回收这些对象 (*env)->DeleteLocalRef(env, obj); (*env)->DeleteLocalRef(env, jobj_arr);复制代码

需要注意的是:局部引用不能在多个线程间传递

全局引用

局部引用:调用NewGlobalRef基于局部引用创建,会阻GC回收所引用的对象。需要调用DeleteGlobalRef手动释放

作用:可以跨越多个线程,在程序员手动释放之前,一直有效。

jstring global_str;//设置global_strJNIEXPORT void JNICALL Java_com_tz_jni_TestNative_createGlobalRef(JNIEnv * env, jobject j_obj){	jstring obj = (*env)->NewStringUTF(env, "jni development is powerful!");	global_str = (*env)->NewGlobalRef(env, obj);}//访问global_strJNIEXPORT jstring JNICALL Java_com_tz_jni_TestNative_getGlobalRef(JNIEnv * env, jobject obj){	return global_str;}//释放global_strJNIEXPORT void JNICALL Java_com_tz_jni_TestNative_deleteGlobalRef(JNIEnv * env, jobject obj){	(*env)->DeleteGlobalRef(env, global_str);}复制代码

弱全局引用

调用NewWeakGlobalRef基于局部引用或全局引用创建,不会阻止GC回收所引用的对象,可以跨方法、跨线程使用。

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

创建:NewWeakGlobalRef 销毁:DeleteGlobalWeakRef

转载地址:http://hnizo.baihongyu.com/

你可能感兴趣的文章
MSSQL数据库跨表和跨数据库查询方法简(转)
查看>>
spring3.0.7中各个jar包的作用总结
查看>>
Windows 10 /win10 上使用GIT慢的问题,或者命令行反应慢的问题
查看>>
SSM——查询_分页
查看>>
梯度下降(Gradient descent)
查看>>
Windows平台分布式架构实践 - 负载均衡
查看>>
如何让LinearLayout也有类似Button的点击效果?
查看>>
JAVA读取文件方法大全
查看>>
寻找最小的k个数
查看>>
CSS3中的动画效果记录
查看>>
CI框架整合微信公共平台接口
查看>>
XCode快捷键
查看>>
request.getScheme()的使用方法
查看>>
Kaldi单音素模型 训练部分
查看>>
Android快速开发常用知识点系列目录
查看>>
Java ActiveMQ队列模式案例
查看>>
EJB2的配置
查看>>
最容易理解的对卷积(convolution)的解释
查看>>
《机器学习实战》知识点笔记目录
查看>>
Linux操作系统实时性分析
查看>>