gpt4 book ai didi

java - 异步调用如何获取JNI接口(interface)指针(JNIEnv *)

转载 作者:IT老高 更新时间:2023-10-28 13:51:51 25 4
gpt4 key购买 nike

了解到JNI接口(interface)指针(JNIEnv *)只在当前线程中有效。假设我在 native 方法中启动了一个新线程;它如何将事件异步发送到 Java 方法?因为这个新线程不能引用(JNIEnv *)。为 (JNIEnv *) 存储一个全局变量显然不起作用?

最佳答案

您可以通过 JNIEnv->GetJavaVM 获得指向 JVM (JavaVM*) 的指针。 .您可以安全地将该指针存储为全局变量。稍后,在新线程中,您可以使用 AttachCurrentThread将新线程附加到 JVM,如果你是用 C/C++ 创建的,或者只是 GetEnv如果你在 java 代码中创建了线程,我不认为因为 JNI 会传递给你一个 JNIEnv* 那么你就不会遇到这个问题。

    // JNIEnv* env; (initialized somewhere else)
JavaVM* jvm;
env->GetJavaVM(&jvm);
// now you can store jvm somewhere

// in the new thread:
JNIEnv* myNewEnv;
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_6; // choose your JNI version
args.name = NULL; // you might want to give the java thread a name
args.group = NULL; // you might want to assign the java thread to a ThreadGroup
jvm->AttachCurrentThread((void**)&myNewEnv, &args);
// And now you can use myNewEnv

关于java - 异步调用如何获取JNI接口(interface)指针(JNIEnv *),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com