我正在实现一些JNI回调(本机-> java)功能,与另一个更大的本机框架一起使用。在该框架的回调中,我在尝试回调java时会遇到这个错误。
FATAL Error in native method: Using JNIEnv in non-java thread
这到底是什么意思?什么是java线程,如何在另一个本机线程中使用JNI?
发布于 2014-05-30 20:39:16
对要在其上执行的线程进行必须附在。
JNI接口指针(
JNIEnv
)仅在当前线程中有效。如果另一个线程需要访问Java,它必须首先调用AttachCurrentThread()将自己附加到VM并获得一个JNI接口指针。一旦附加到VM,本机线程的工作方式就像运行在本机方法中的普通Java线程一样。
为此,必须通过JNI_OnLoad()
导出或通过使用(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
是没有操作的,因此是无害的。
https://stackoverflow.com/questions/23962972
复制相似问题