美文网首页
JNI--局部引用,全局引用,弱全局引用

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

作者: aruba | 来源:发表于2020-04-08 15:35 被阅读0次

    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);
    }
    

    相关文章

      网友评论

          本文标题:JNI--局部引用,全局引用,弱全局引用

          本文链接:https://www.haomeiwen.com/subject/knytmhtx.html