JNI--局部引用,全局引用,弱全局引用
JNI中有三种引用
1.局部引用--定义方式多样:FindClass,NewObject,GetObjectClass,NewCharArray.... NewLocalRef()
我们一般的变量就是局部引用,不能在多线程里面使用
释放方式: 1 方法调用完JVM 会自动释放 2.DeleteLocalRef。JNI中同一时间最多使用512个局部引用,所以我们有必要去手动释放
//局部引用
JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5_localRef
(JNIEnv* env, jobject jobj) {
//创建一个局部引用
jstring jstr = env->NewStringUTF("哈哈");
//使用局部引用
printf("%s",jstr);
//释放局部引用
env->DeleteLocalRef(jstr);
}
2.全局引用--可跨线程,跨方法使用
NewGlobalRef 是创建全局引用的唯一方法
创建全局引用
//创建全局引用
jstring global_str;
JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5_createGlobalRef
(JNIEnv* env, jobject jobj) {
jobject jstr = env->NewStringUTF("hello");
global_str = (jstring)env->NewGlobalRef(jstr);
}
获取全局引用
//获取全局引用
JNIEXPORT jstring JNICALL Java_com_aruba_jniapplication_JniDemo5_getGlobalRef
(JNIEnv* env, jobject jobj) {
return global_str;
}
删除全局引用
//删除全局引用
JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5_delGlobalRef
(JNIEnv* env, jobject jobj) {
env->DeleteGlobalRef(global_str);
}
执行java代码
package com.aruba.jniapplication;
/**
* JNI 引用
*/
public class JniDemo5 {
static {
System.load("C:\\Users\\tyqhc\\source\\repos\\JniApplication\\x64\\Debug\\JniApplication.dll");
}
public native void localRef();
public native void createGlobalRef();
public native String getGlobalRef();
public native void delGlobalRef();
public static void main(String[] args) {
JniDemo5 jniDemo5 = new JniDemo5();
jniDemo5.createGlobalRef();
System.out.println(jniDemo5.getGlobalRef());
jniDemo5.delGlobalRef();
}
}

image.png
3.弱全局引用--它不会阻止GC,可跨线程,跨方法使用
//创建弱全局引用
jstring global_weak_str;
JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5_createGlobalWeakRef
(JNIEnv* env, jobject jobj) {
jobject jstr = env->NewStringUTF("hello");
global_weak_str = (jstring)env->NewWeakGlobalRef(jstr);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!