jni的引用

局部引用
1.在jni函数中创建的引用,主要通过以下两种方式创建
<1> NewLocalRef函数创建
<2>常用函数,findClass,GetMethodId,等。
2.局部引用能够阻止虚拟机的垃圾回收器的回收工作。不能用static 来修饰局部引用。
static jstring name=(*env)->NewStringUTF(env,"123");//这个是错误的,static 变量的生命周期是全局的,作用域是局部的。
3.jni函数中可以返回局部引用,这是因为局部引用在函数返回后,虚拟机并没有将这个局部引用回收,这一点和C 语言函数中的局部变量是不同的,程序员可以在函数中手动通过DeleteLocalRef函数来删除局部引用,局部引用被删除后,虚拟机才会回收该局部变量。如果程序员没有通过DeleteLocalRef来删除局部应用,而局部应用逐渐增多后,由虚拟机自己动态决定回收局部引用,这是一个不可预知的过程,虚拟机对能够保存的局部引用的数量是有限制的。
4.局部引用不能在多个线程中共享。
5.对于被虚拟机频繁调用的jni函数,一定要及时显示删除不必要的局部引用,因为局部引用不能被及时回收,这样会导致out of memory.
全局引用
1.全局引用的生命周期是全局的,直到你显示的删除它
2.通过 NewGlobalRef,创建,这个方法的参数可以是一个局部引用,或者全局引用,或者弱全局引用。和局部引用一样,全局应用会阻止虚拟机的垃圾回收器的回收工作。
3.通过 DeleteGlobalRef 删除。
2.全局引用可以在多线程中实现共享。
弱全局引用
1.弱全局引用的生命周期是全局的,它能够被虚拟机的垃圾回收器回收。
2.弱全局引用和全局引用一样,可以通过函数创建和删除。(NewGlobalRef,DeleteWeakGlobalRef).一旦创建一直有效,直到显示删除。
3.在使用弱全局引用时,需要判断它是否已经被虚拟机回收。
static jobject weak_global_ref = NULL;

jobject local_ref;
/* We ensure create local_ref success */、
while ( week_global_ref == NULL

    || (local_ref = NewLocalRef(env, weak_global_ref)) == NULL )

{

    /* Init week global referrence again */

    weak_global_ref = NewWeakGlobalRef(...);

}
4.弱全局引用可以在多线程中共享。
5.jclass 一般用弱全局引用来保存,不能使用全局引用保存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值