jni引用



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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值