首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )

  • 25-02-16 05:21
  • 3570
  • 8879
blog.csdn.net

文章目录

        • I . 弱全局引用
        • II . 弱全局引用判定是否被回收
        • III . 弱全局引用 创建 与 删除 ( NewWeakGlobalRef | DeleteWeakGlobalRef )
        • IV . 弱全局引用代码示例



I . 弱全局引用


若全局引用 特点 : 弱全局引用 最大的特点是 可以被 JVM 自动回收 ;


弱全局引用 作用域 :

① 空间 : 都可以 跨方法 , 跨线程使用

② 时间 : 创建弱全局引用后可以开始使用 , JVM 自动回收 或 手动释放 该弱全局引用不可用 ;


弱全局引用 与 全局引用 区别 :

① 全局引用 : 不能被 回收 , 如果内存不足就 抛出异常

② 弱全局引用 : 当内存不足时 , 会被系统自动回收



II . 弱全局引用判定是否被回收


弱全局引用 判定是否被回收 :


使用 IsSameObject(弱引用变量 , NULL) 判断该对象是否被回收了 , 将其与 NULL 比较 , 即可判定该若全局引用是否被 JVM 回收 ;

① 返回 true ( 该对象与NULL相等 ) : 该若全局引用已经被释放 ;

② 返回 false ( 该对象与NULL不相等 ) : 该弱全局引用还可以使用 ;



III . 弱全局引用 创建 与 删除 ( NewWeakGlobalRef | DeleteWeakGlobalRef )


函数原型 :

struct _JNIEnv {
    /* _JNIEnv  结构体中封装了 JNINativeInterface 结构体指针 */
    const struct JNINativeInterface* functions;
    ...
    // 最终 调用的 还是 JNINativeInterface 结构体中封装的 NewWeakGlobalRef 方法
    jweak NewWeakGlobalRef(jobject obj)
    { return functions->NewWeakGlobalRef(this, obj); }

	// 最终 调用的 还是 JNINativeInterface 结构体中封装的 DeleteWeakGlobalRef 方法
    void DeleteWeakGlobalRef(jweak obj)
    { functions->DeleteWeakGlobalRef(this, obj); }
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

① NewWeakGlobalRef : 传入局部变量作为参数 , 创建弱全局引用 ;

② DeleteWeakGlobalRef : 释放弱全局引用 ;



IV . 弱全局引用代码示例


// 弱全局引用
//  访问时如果局部变量也有同名变量 , 可以使用 域作用符 访问
//  ::class_teacher_weak_global 表示访问全局的变量
jclass class_teacher_weak_global;

extern "C"
JNIEXPORT void JNICALL
Java_kim_hsl_jni_MainActivity_jniWeakGlobalReferenceTest(JNIEnv *env, jobject instance) {

    /*
        弱全局引用

        弱全局引用 与 Java 引用类似

        弱全局引用 作用域 :
            空间 : 都可以 跨方法 , 跨线程使用
            时间 : 创建弱全局引用后可以开始使用 , JVM 自动回收 或 手动释放 该弱全局引用不可用

        弱全局引用 与 全局引用 区别 :
            全局引用 : 不能被 回收 , 如果内存不足就 抛出异常
            弱全局引用 : 当内存不足时 , 会被系统自动回收

        弱全局引用 判定是否被回收 :
            使用 IsSameObject(弱引用变量 , NULL) 判断该对象是否被回收了 , 将其与 NULL 比较 , 即可判定
                返回 true ( 该对象与NULL相等 ) : 该若全局引用已经被释放
                返回 false ( 该对象与NULL不相等 ) : 还可以使用



     */

    // 1 . 获取 Teacher 类 ( 该变量需要释放 )

    //如果 class_teacher_weak_global 对象被回收 , 返回 true ; 没有被回收返回 false ;
    jboolean isClassReleased = env->IsSameObject(class_teacher_weak_global, NULL);

    if( class_teacher_weak_global == NULL || isClassReleased ) {

        //生成局部引用 , 该局部引用使用完毕后可释放
        jclass tmp_class = env->FindClass("kim/hsl/jni/Teacher");

        //将上述生成的局部引用变成弱全局引用
        //      弱全局引用释放时 , env->DeleteWeakGlobalRef(class_teacher_weak_global) 即可释放下面转换的弱全局引用
        class_teacher_weak_global = static_cast<jclass>(env->NewWeakGlobalRef(tmp_class));

        //将局部引用释放掉
        env->DeleteLocalRef(tmp_class);

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
注:本文转载自blog.csdn.net的韩曙亮的文章"https://blog.csdn.net/shulianghan/article/details/104194348"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top