Android NDK学习笔记13-JNI的局部和全局引用
2016-09-22 18:40
211 查看
局部引用
大多数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函数检验一个弱全局引用是否仍然指向活动的类实例,例如:
if(JNI_FALSE == (*env)->IsSameObject(env,weakGlobalClazz,NULL)){ /*对象仍然处于活动状态且可以使用*/ }else{ /*对象被垃圾回收期收回,不能使用*/ }
删除弱全局引用
可以随时使用DeleteWeakGlobalRef函数释放弱全局引用。(*env)->DeleteLocalRef(env,weakGlobalClazz);
相关文章推荐
- Android NDK学习笔记13-JNI的局部和全局引用
- Android NDK(六):JNI局部引用和全局引用
- JNI官方文档翻译5-局部和全局引用
- JNI 局部引用、全局引用和弱全局引用
- JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用
- Sun-JNI文档系列之六——第五章:局部引用与全局引用
- JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用
- JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式
- JNI局部引用、全局引用和弱全局引用
- Android NDK 开发(四)JNI 中局部引用、全局引用和弱全局引用
- Android NDK 开发(四)JNI 中局部引用、全局引用和弱全局引用
- NI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用
- NDK开发-JNI 局部引用、全局引用和弱全局引用
- JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式
- JNI 中局部引用和全局引用
- JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用
- 传智播客JNI第七讲 - JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式
- JNI学习笔记——局部和全局引用
- 第五章 JNI 中局部引用和全局引用
- JNI中的全局引用、局部引用、弱全局引用 AND 缓存jfieldID和jmethodID的两种方法