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 来停止线程的运行,并等待线程结束。

相关推荐
不知几秋3 分钟前
Spring Boot
java·前端·spring boot
Love__Tay8 分钟前
【学习笔记】Python金融基础
开发语言·笔记·python·学习·金融
Lilith的AI学习日记21 分钟前
什么是预训练?深入解读大模型AI的“高考集训”
开发语言·人工智能·深度学习·神经网络·机器学习·ai编程
程序员岳焱1 小时前
深度剖析:Spring AI 与 LangChain4j,谁才是 Java 程序员的 AI 开发利器?
java·人工智能·后端
wangjinjin1801 小时前
Python Excel 文件处理:openpyxl 与 pandas 库完全指南
开发语言·python
愚润求学1 小时前
【C++】类型转换
开发语言·c++
都叫我大帅哥1 小时前
AQS(AbstractQueuedSynchronizer)深度解剖:从“奶茶店排队”到源码级设计哲学
java
斯奕sky_small-BAD1 小时前
C++ if语句完全指南:从基础到工程实践
java·开发语言·php
云之渺1 小时前
125java
java
都叫我大帅哥1 小时前
Java ReentrantLock:从“舔狗式等待”到源码级征服指南
java