jni的引用

来源:互联网 发布:淘宝达人 微淘 编辑:程序博客网 时间:2024/06/02 00:36
局部引用
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 一般用弱全局引用来保存,不能使用全局引用保存

原创粉丝点击