JNI:生成需要与 Java 交互的线程的本机方法

JNI: native method that spawns threads that need to interact with 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 指针?

另一种方法是缓存您在 JNI_OnLoad 中收到的 JavaVM*

另一种方法是调用 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