专栏首页android技术JNI--局部引用,全局引用,弱全局引用

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NDK--文件的拆分和合并

    aruba
  • JNI--static静态修饰符和弱引用联合使用会出现的bug

    当static的修饰符出现是,表明该变量为静态变量,当我们为一个局部静态变量赋一个局部引用时(jstring,jclass,jint等),gc有可能会因为内存不...

    aruba
  • JNI--动态注册

    静态注册: 每个class都需要使用javah生成一个头文件,并且生成的名字很长书写不便;初次调用时需要依据名字搜索对应的JNI层函数来建立关联关系,会影响运...

    aruba
  • 一道颇有难度的JavaScript题

    上次分享了一道题,大家反响不错,很开心自己写的东西有人愿意花时间去看,也给了自己莫大的鼓舞,其实做题虽然不比真正的编程,但是也能够让你发现一些你之前没有注意到的...

    :::::::
  • 2020-10-04:java中GC Root 对象有哪些?

    1.虚拟机栈(栈帧中的本地变量表)中引用的对象;各个线程调用方法堆栈中使用到的参数、局部变量、临时变量等。

    福大大架构师每日一题
  • Kotlin京东业务实战 | 强大又简洁的JVM语言

    9年以上开发经验,熟悉主流移动开发框架,热衷于探索新技术,曾负责过店铺、JDReact架构等项目的开发工作,目前专注于京东App领券中心频道开发,以及移动端技术...

    京东技术
  • 第六章:如何在SpringBoot项目中使用拦截器

    恒宇少年
  • JNI之路径初探---6

    本篇文章讲解JNI下属性的内存释放问题,众所周知,JAVA有四大引用,1,强引用2,弱引用3,软引用4,虚引用。JNI有三大引用,1,普通全局引用2,弱全局引用...

    萬物並作吾以觀復
  • 跟面试官聊到JVM,他99%会让你谈谈这个问题!

    但凡问到 JVM(Java 虚拟机)通常有 99% 的概率一定会问: 在 JVM 中如何判断一个对象的生死状态?

    美的让人心动
  • Mac里捣腾Kerberos(一)

    最近需要解决一个部门一个老旧问题,问题大概是这样的,Spark on K8S 在访问 HDFS(其他小组负责)的时候需要走 Kerberos 认证。因为之前工作...

    runzhliu

扫码关注云+社区

领取腾讯云代金券