// JNI引用变量
// 引用类型主要是 局部引用和全局引用
// 作用:在JNI中告知虚拟机何时回收一个JNI变量
// 局部引用,通过DeleteLocalRef手动释放对象
// 1,访问一个很大的java对象,使用完之后,还要进行复杂的耗时操作,
// 2,创建了大量的局部引用,占用了太多的内存,而且局部引用跟后面的操作没有关联性。
// 模拟:循环创建数据
extern "C"
JNIEXPORT void JNICALL
Java_com_XXX_XXX_XXX_localRef(JNIEnv * env, jobject jobj){
int i = 0;
for (; i < 5; ++i) {
// 创建Date对象
jclass cls = env->FindClass("java/util/Date");
jmethodID constructor_mid = env->GetMethodID(cls,"<init>","()V");
jobject obj = env->NewObject(cls,constructor_mid);
// 此处省略一些代码,
// 不再使用jobject对象
// 通知垃圾回收器回收这些对象
env->DeleteLocalRef(obj);
// 此处省略一些代码,
}
}
// 全局引用
// 共享(可以跨多个线程),手动控制内存使用
jstring global_str;
// 创建
extern "C"
JNIEXPORT void JNICALL
Java_com_XXX_XXX_XXX_createGlobalRef(JNIEnv * env, jobject jobj){
jstring obj = env->NewStringUTF("jni development is powerful!");
global_str = (jstring)env->NewGlobalRef(obj);
}
// 获得
extern "C"
JNIEXPORT jstring JNICALL
Java_com_XXX_XXX_XXX_getGlobalRef(JNIEnv * env, jobject jobj){
return global_str;
}
// 释放
extern "C"
JNIEXPORT void JNICALL
Java_com_XXX_XXX_XXX_deleteGlobalRef(JNIEnv * env, jobject jobj){
env->DeleteGlobalRef(global_str);
}
// 弱全局引用
// 节省内存,在内存不足时可以是释放所引用的对象,
// 可以引用一个不常用的对象,如果为NULL,临时创建。
// 创建NewWeakGlobalRef,销毁:DeleteGlobalWeakRef
JNI中局部引用,全局引用,弱引用
最新推荐文章于 2022-03-04 13:30:27 发布