前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JNI--局部引用,全局引用,弱全局引用

JNI--局部引用,全局引用,弱全局引用

作者头像
aruba
发布2020-07-02 17:15:06
1.5K0
发布2020-07-02 17:15:06
举报
文章被收录于专栏:android技术android技术
JNI中有三种引用
1.局部引用--定义方式多样:FindClass,NewObject,GetObjectClass,NewCharArray.... NewLocalRef()
我们一般的变量就是局部引用,不能在多线程里面使用
释放方式: 1 方法调用完JVM 会自动释放 2.DeleteLocalRef。JNI中同一时间最多使用512个局部引用,所以我们有必要去手动释放
代码语言:javascript
复制
//局部引用
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 是创建全局引用的唯一方法

创建全局引用

代码语言:javascript
复制
//创建全局引用
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);
}

获取全局引用

代码语言:javascript
复制
//获取全局引用
JNIEXPORT jstring JNICALL Java_com_aruba_jniapplication_JniDemo5_getGlobalRef
(JNIEnv* env, jobject jobj) {
    return global_str;
}

删除全局引用

代码语言:javascript
复制
//删除全局引用
JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5_delGlobalRef
(JNIEnv* env, jobject jobj) {
    env->DeleteGlobalRef(global_str);
}
执行java代码
代码语言:javascript
复制
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,可跨线程,跨方法使用
代码语言:javascript
复制
//创建弱全局引用
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);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JNI中有三种引用
  • 1.局部引用--定义方式多样:FindClass,NewObject,GetObjectClass,NewCharArray.... NewLocalRef()
    • 我们一般的变量就是局部引用,不能在多线程里面使用
      • 释放方式: 1 方法调用完JVM 会自动释放 2.DeleteLocalRef。JNI中同一时间最多使用512个局部引用,所以我们有必要去手动释放
      • 2.全局引用--可跨线程,跨方法使用
        • NewGlobalRef 是创建全局引用的唯一方法
          • 执行java代码
          • 3.弱全局引用--它不会阻止GC,可跨线程,跨方法使用
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档