本机方法中的致命错误:在非java线程中使用JNIEnv

本机方法中的致命错误:在非java线程中使用JNIEnv,java,java-native-interface,Java,Java Native Interface,我在另一个更大的本机框架旁边实现了一些JNI回调(native->java)功能,在该框架的一个回调上,我在尝试回调java时遇到了这个错误 这到底意味着什么?什么是java线程?如何在另一个本机线程中使用JNI?java到它要在其上执行的线程 JNI接口指针(JNIEnv)仅在当前线程中有效。如果另一个线程需要访问Java VM,它必须首先调用AttachCurrentThread()将自身连接到VM并获取JNI接口指针。一旦连接到VM,本机线程的工作方式与在本机方法中运行的普通Java线程类

我在另一个更大的本机框架旁边实现了一些JNI回调(native->java)功能,在该框架的一个回调上,我在尝试回调java时遇到了这个错误

这到底意味着什么?什么是java线程?如何在另一个本机线程中使用JNI?

java到它要在其上执行的线程

JNI接口指针(
JNIEnv
)仅在当前线程中有效。如果另一个线程需要访问Java VM,它必须首先调用AttachCurrentThread()将自身连接到VM并获取JNI接口指针。一旦连接到VM,本机线程的工作方式与在本机方法中运行的普通Java线程类似

为此,必须通过导出或通过使用
(JNIEnv*)java->GetJavaVm(&(JavaVM*)JVM)实现的JNI
native
调用存储指向JVM对象的指针

从这里开始,每次需要使用JNI时,只需调用以下命令即可连接到当前线程并检索新的
JNIEnv*
指针

JNIEnv* AttachJava()
{
    JavaVMAttachArgs args = {JNI_VERSION_1_2, 0, 0};
    JNIEnv* java;
    jvm->AttachCurrentThread((void**) &java, &args);
    return java;
}

不要保存
JNIEnv*
的实例,除非您确定它们将在同一线程中引用


如前所述,在已连接的线程上调用
AttachCurrentThread
是不可操作的,因此是无害的。

Downvoter-要解释一下吗?
JNIEnv* AttachJava()
{
    JavaVMAttachArgs args = {JNI_VERSION_1_2, 0, 0};
    JNIEnv* java;
    jvm->AttachCurrentThread((void**) &java, &args);
    return java;
}