首页 > 解决方案 > JNI:产生需要与 Java 交互的线程的本地方法

问题描述

我有一个从 Java 进程调用的 C 方法:

extern "C" {
    JNIEXPORT jstring JNICALL Java_bla_bla_bla(JNIEnv *env, jclass java_class, jint param) {
         /* Spawn C threads that are going to call Java methods */
    }
}

问题是我的本地方法从 Java 获得的所有东西都是一个JNIEnv实例。为了打电话AttachCurrentThread(),我需要一个JavaVM对象。

如何JavaVM从本机方法中获取指针?

标签: javajava-native-interfacejnienv

解决方案


一种替代方法是缓存JavaVM*您收到的JNI_OnLoad.

另一种选择是调用GetJavaVM属于以下部分的函数JNIEnv

JNIEXPORT jstring JNICALL Java_bla_bla_bla(JNIEnv *env, jclass java_class, jint param) {
    JavaVM *jvm;
    if (env->GetJavaVM(&jvm)) {
        // Something went wrong
    }
    // Pass jvm to the new thread

推荐阅读