JNI全局引用保存Java对象的引用

在JNI中,可以使用全局引用(Global Reference)来保存Java对象的引用。全局引用是一种特殊的引用类型,它可以在JNI环境中长期保存Java对象的引用,直到显式释放。

下面是一种在JNI中保存Java对象的简单示例:

  1. 首先,在JNI的头文件中声明一个全局变量用于保存对象的全局引用。

    复制代码
    jobject callBack;
    jmethodID callMethod;
  2. 在JNI代码的实现中,通过NewGlobalRef函数将Java对象转换为全局引用,并将其保存到全局变量中。在适当的时候,可以使用DeleteGlobalRef函数释放全局引用

    复制代码
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_test_jnitest_TestLib_init(JNIEnv *env, jobject thiz, jobject call_back) {
        // 将Java对象转换为全局引用
        callBack = env->NewGlobalRef(call_back);
        jclass  callClass = env->GetObjectClass(callBack);
        callMethod = env->GetMethodID(callClass,"onData","(ILjava/lang/String;)V");
    }
  3. 在需要使用保存的对象的地方,可以直接使用保存的全局引用进行操作。

    下面举例在JNI中创建一个定时循环线程调用JAVA方法

    复制代码
     // 线程函数,用于定时循环执行任务
    void TimerLoop() {
        JNIEnv* env = AttachCurrentThreadIfNeeded();
        while (isRunning) {
            // 执行需要循环的任务,例如调用Java方法
            count++;
            jstring arg2 = env->NewStringUTF("HelloWorld");
            env->CallVoidMethod(callBack, callMethod,count,arg2);
            env->DeleteLocalRef(arg2);
            // 线程休眠一段时间,例如1000毫秒
            std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        }
        g_vm->DetachCurrentThread();
    }
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_test_jnitest_TestLib_start(JNIEnv *env, jobject thiz) {
        // 检查线程是否已经在运行
        if (isRunning) {
            return;
        }
        // 创建线程并开始运行
        isRunning = true;
        timerThread = std::thread(TimerLoop);
    }
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_test_jnitest_TestLib_stop(JNIEnv *env, jobject thiz) {
        // 停止线程运行
        if (isRunning) {
            isRunning = false;
            env->DeleteGlobalRef(callBack);
        }
    }

在上面的示例代码中,我们首先定义了一个全局变量 timerThread 和一个标志 isRunning 来控制线程的运行状态。isRunning 变量用于在定时循环中控制任务的执行和线程的停止。在start函数中,我们通过创建一个新的标准库线程 (std::thread) 并传递 TimerLoop 函数作为线程函数来启动定时循环线程。在 stop 函数中,我们将 isRunning 设置为 false 来停止线程的运行,并等待线程结束。

相关推荐
nlog3n1 小时前
Java策略模式详解
java·bash·策略模式
Qlittleboy2 小时前
windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片
开发语言·windows·php
水w2 小时前
【Android Studio】解决报错问题Algorithm HmacPBESHA256 not available
android·开发语言·android studio
冷琅辞3 小时前
Elixir语言的云计算
开发语言·后端·golang
Mryan20054 小时前
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
java·开发语言·spring boot·maven
Naomi5214 小时前
自定义汇编语言(Custom Assembly Language) 和 Unix & Git
服务器·开发语言·git·unix
烂蜻蜓4 小时前
C 语言命令行参数:让程序交互更灵活
c语言·开发语言·交互
VX_CXsjNo14 小时前
免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制
java·spring boot·spring·游戏·eclipse·android studio·android-studio
zm-v-159304339864 小时前
解锁 DeepSeek 与 Matlab:攻克科研难题的技术利刃
开发语言·matlab·信息可视化
ylfhpy4 小时前
Java面试黄金宝典33
java·开发语言·数据结构·面试·职场和发展·排序算法