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 一般用弱全局引用来保存,不能使用全局引用保存
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 一般用弱全局引用来保存,不能使用全局引用保存
- jni的引用
- 关于JNI的本地引用
- jni引用
- AndroidICS(4.0+)JNI局部引用的变化
- JNI对引用数据类型的操作
- JNI的局部和全局引用
- JNI 引用与缓存
- JNI引用与缓存
- JNI引用Java对象
- 关于jni中.h无法直接引用.cpp的问题
- Android冰淇淋三明治ICS(4.0+)JNI局部引用的变化
- 在AndroidStudio中引用jni的时候出错
- JNI引用溢出导致的重启问题分析
- 传智播客JNI第七讲 - JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式
- JNI中的全局引用、局部引用、弱全局引用 AND 缓存jfieldID和jmethodID的两种方法
- JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式
- JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式
- jni中的本地引用和全局引用
- struts2源码的解读 .
- Android4.0.1 Activity的DecorView与SurfaceFlinger的Surface之间关系的建立过程分析
- 关于PCI IRQ routing的讨论
- mysql开发规范文档
- linux驱动面试题目汇总
- jni的引用
- jni的异常处理
- 关于C51内的code idata data bdata pdata xdata
- poj 2240 Arbitrage(最短路+Bellman-Ford)
- 检查表单是否为空,不用弹出窗口
- C51编程中对单片机绝对地址访问的两种方法
- Android开发教程——Android用户接口组件
- Listview中取数据
- Struts1和Struts2的比较