jni引用

来源:互联网 发布:web服务器 软件 编辑:程序博客网 时间:2024/06/14 10:27


jni引用:
jni和java关系:
jni是jvm的一部分,如果要用jni去访问虚拟机内部的数据结构。
jni在java中自定义的class,在jvm中会形成内部数据结构。当
需要访问时,jni就要提供一套接口来访问。这个接口给我们去访问
jvm数据结构时和jni之前就声称对应的数据结构,这个就是引用
当我们想要访问jvm虚拟机中数据结构时,只可以使用jni的引用


jni三种引用
局部引用
全局引用
弱引用


局部引用:
public void native localRef();


for(i=0;i<5;i++){
获取jclass
....
获取构造方法的methodID
(*env)->GetMethodID(env,cls,"<init>","()V")
创建一个date类型的局部引用:
jobject obj  = (*env)->NewObject(env,cls,jmid)
}
(*env)->DeleteLoaclRef(env,cls)
释放引用


局部引用定义方式多样:
findclass获取的jlcass也是一个局部引用
还有NewObject GetObjectClass,NewCharArray...NewLoaclRef()
一旦接口是用来生成jvm中非基本类型数据结构的方法,就是引用


为什么要释放引用:
jni释放局部引用方式:
1.方法调用完毕,JVM自动释放
2.手动释放,通过DeleteLocalRef


JVM中有一个JNI局部引用表,一共可容纳512个,没创建一个就会往里边放进去
非常容易JNI引用表溢出,因此要记得手动释放


局部引用不能再多线程中使用,只能应用于定义它的接口中


全局引用:
可以跨线程跨方法使用
创建全局引用的唯一方法:NewGlobalRef是创建全局引用的唯一方法
函数外定义一个jstring atf
(*env)->NewStringUTF(env,"JNI is sdawda");
atf = (*ENV)->NewGlobalRef(env,obj);


弱全局引用
也可以跨线程跨方法使用
jclass weak;
创建一个基本类。用局部引用转换成全局引用
weak = (env)->NewWeakGlobalRef(env,局部jclass)


和全局,局部区别:不会阻止GC,内存不够时可以随时释放。类似java中弱引用