JNI的局部和全局引用

《Pro Android C++ with the NDK》学习笔记
  • 局部引用
  • 全局引用
  • 弱全局引用
一、局部引用

大多数JNI函数返回局部引用。局部引用不能在后续的调用中被缓存及重用,主要是因为它们的使用期限仅限于原生方法,一旦原生函数返回,局部引用即被释放。例如,使用FindClass函数返回一个局部引用,当原生方法返回时,它被自动释放,也可以用DeleteLocalRef函数显式释放原生代码:

jclass clazz
clazz = (*env)->FindClass(env,"java/lang/String");
……
(*env)->DeleteLocalRef(env,clazz);

根据JNI的规范,虚拟机应该允许原生代码创建最少16个局部引用。

二、全局引用

全局引用在原生方法的后续调用过程中依然有效,除非它们被原生代码显示释放。

1.创建全局引用

可以用NewGlobalRef函数将局部引用初始化为全局引用,例如:

jclass localclazz
jclass globalclazz
……
localclazz = (*env)->FindClass(env,"java/lang/String");
globalclazz = (*env)->NewGlobalRef(env,localclazz );
……
 (*env)->DeleteLocalRef(env,localclazz );

2.删除全局引用

当原生代码不再需要一个全局引用时,可以随时用DeleteLocalRef函数释放它。

(*env)->DeleteLocalRef(env,globalclazz );
三、弱全局引用

弱全局引用和全局引用一样,在原生方法的后续调用过程中依然有效。与全局引用不同,弱全局引用并不阻止潜在的对象被垃圾回收。

1.创建弱全局引用

用NewWeakGlobalRef函数对弱全局引用进行初始化,例如:

jclass weakGlobalclazz
weakGlobalclazz = (*env)->NewWeakGlobalRef(env,localclazz);

2.弱全局引用的有效性校验

可以使用IsSameObject函数检验一个弱全局引用是否仍然指向活动的类实例。如果基本对象没被垃圾收集,则返回JNI_FALSE,否则返回JNI_TRUE。例如:

if(JNI_FALSE == (*env)->IsSameObject(env,weakGlobalClazz,NULL)){
/*对象仍然处于活动状态且可以使用*/
}else{
/*对象被垃圾回收期收回,不能使用*/
}

3.删除弱全局引用

可以随时使用DeleteWeakGlobalRef函数释放弱全局引用。

(*env)->DeleteLocalRef(env,weakGlobalClazz);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值