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中弱引用
阅读全文
0 0
- jni引用
- JNI 引用与缓存
- JNI引用与缓存
- jni的引用
- JNI引用Java对象
- jni中的本地引用和全局引用
- jni中的本地引用和全局引用
- JNI 本地引用和全局引用
- JNI 中局部引用和全局引用
- JNI全局引用和本地引用
- JNI引用与垃圾回收
- JNI引用与垃圾回收
- WebViewCore/SurfaceHolder and JNI引用
- JNI规范中的对象引用
- 关于JNI的本地引用
- JNI引用与垃圾回收
- JNI引用与垃圾回收
- Android JNI局部引用表
- 1113:数列有序
- Android
- httpClient
- json字符串转map
- 创建和删除swap文件
- jni引用
- PCA 主成分分析
- How to fix “The system is running in low-graphics mode” Ubuntu 17.04 or 16.04
- POJ3267-The Cow Lexicon(dp)
- Fragment根据网络返回状态显示不用界面
- json的一些常用
- 自定义反向比较器reverseSort
- Angular内置过滤器+orderBy排序+模糊查询
- CommonsChunkPlugin的一些总结,以及如何分别打包公共代码和第三方库