我了解到JNI接口指针(JNIEnv *)只在当前线程中有效。假设我在一个本机方法中启动了一个新线程;它如何向Java方法异步发送事件?因为这个新线程不能有(JNIEnv *)的引用。存储(JNIEnv *)的全局变量显然不会起作用?
发布于 2012-10-16 01:35:48
您可以使用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
https://stackoverflow.com/questions/12900695
复制相似问题