Android JNI开发系列:第五章 局部和全局引用

    xiaoxiao2025-07-23  6

    项目代码:https://github.com/VincentWei95/ndk

    Android JNI开发系列:第一章 JNIEnv接口指针

    Android JNI开发系列:第二章 数据类型

    Android JNI开发系列:第三章 对引用数据类型的操作

    Android JNI开发系列:第四章 异常处理

    Android JNI开发系列:第五章 局部和全局引用

    Android JNI开发系列:第六章 线程

    Android JNI开发系列:第七章 POSIX线程

    Android JNI开发系列:第八章 POSIX Socket API 面向连接的通信

    Android JNI开发系列:第九章 POSIX Socket API 无连接的通信

    Android JNI开发系列:第十章 POSIX Socket API 本地通信

    JNI支持三种引用:局部引用、全局引用和弱全局引用。

    1 局部引用

    大多数JNI函数返回局部引用,在函数中定义的引用在函数执行结束后就自动释放。也可以用 DeleteLocalRef 函数显式释放。

    jclass clazz; clazz = (*env)->FindClass(env, "java/lang/String"); ... (*env)->DeleteLocalRef(env, clazz);

    2 全局引用

    2.1 创建全局引用

    jclass localClazz; jclass globalClazz; ... localClazz = (*env)->FindClass(env, "java/lang/String"); // 用局部引用创建全局引用 globalClazz = (*env)->NewGlobalRef(env, localClazz); ... (*env)->DeleteLocalRef(env, localClazz);

    2.2 删除全局引用

    (*env)->DeleteGlobalRef(env, globalClazz);

    3 弱全局引用

    3.1 创建弱全局引用

    jclass weakGlobalClazz; weakGlobalClazz = (*env)->NewWeakGlobalRef(env, localClazz);

    3.2 弱全局引用的有效性校验

    if ((*env)->IsSameObject(env, weakGlobalClazz, NULL) == JNI_FALSE) { // 弱全局引用仍然处于活动状态且可使用 } else { // 弱全局引用被垃圾回收器回收,不能使用 }

    3.3 删除弱全局引用

    (*env)->DeleteWeakGlobalRef(env, weakGlobalClazz);
    最新回复(0)