引用分类
JNI引用的分类即 jobject的分类
在JNI中属于jobject类型的有:
1.局部引用 本地方法栈内有效
2.全局引用 虚拟机全局生效 不会被GC回收
3.弱全局引用 虚拟机全局生效GC时被回收
局部引用
下面方法的返回值都是属于局部引用
1.方法的jobject参数
2.FindClass
3.GetObjectClass
4.GetObjectField
5.GetObjectArrayElement
6.NewStringUTF
7.NewLocalRef
案例:
比如在jni中访问遍历一个数组,在循环中每次循环都会创建一个局部引用变量,这样会导致局部引用表溢出
所以局部引用必须用完之后马上释放。
释放局部引用的方式有:
// 单独释放
env->DeleteLocalRef(pwdStr);
// 批量释放
env->PushLocalFrame(3);
env->NewLocalRef(pwdStr);
env->NewLocalRef(pwdStr);
env->NewLocalRef(pwdStr);
env->NewLocalRef(pwdStr);
env->PopLocalFrame(NULL);
// 判断剩余局部引用的容量
if(env->EnsureLocalCapacity(3) < 0) {
}
全局引用
env->NewGlobalRef(instance);
env->DeleteGlobalRef(instance);
弱全局引用
env->NewWeakGlobalRef(instance);
env->DeleteWeakGlobalRef(instance);
https://www.cnblogs.com/fnlingnzb-learner/p/7372189.html