本机方法中的致命错误:在非java线程中使用JNIEnv
我在另一个更大的本机框架旁边实现了一些JNI回调(native->java)功能,在该框架的一个回调上,我在尝试回调java时遇到了这个错误 这到底意味着什么?什么是java线程?如何在另一个本机线程中使用JNI?java到它要在其上执行的线程 JNI接口指针(本机方法中的致命错误:在非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线程类
JNIEnv
)仅在当前线程中有效。如果另一个线程需要访问Java VM,它必须首先调用AttachCurrentThread()将自身连接到VM并获取JNI接口指针。一旦连接到VM,本机线程的工作方式与在本机方法中运行的普通Java线程类似
为此,必须通过导出或通过使用(JNIEnv*)java->GetJavaVm(&(JavaVM*)JVM)实现的JNInative
调用存储指向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;
}