java - native 方法中出现 fatal error : Using JNIEnv in non-java thread

标签 java java-native-interface

我正在与另一个更大的 native 框架一起实现一些 JNI 回调( native -> java)功能,并且在框架的回调之一上尝试回调时遇到此错误java.

FATAL Error in native method: Using JNIEnv in non-java thread

这到底是什么意思?什么是 java 线程以及如何在另一个 native 线程中使用 JNI?

最佳答案

Java must be attached到要执行的线程。

The JNI interface pointer (JNIEnv) is valid only in the current thread. Should another thread need to access the Java VM, it must first call AttachCurrentThread() to attach itself to the VM and obtain a JNI interface pointer. Once attached to the VM, a native thread works just like an ordinary Java thread running inside a native method.

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

从这里开始,每次需要使用 JNI 时,只需调用以下代码即可附加到当前线程并检索新的 JNIEnv* 指针。

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

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

作为documentation states ,在已附加的线程上调用 AttachCurrentThread 是无操作,因此是无害的。

关于java - native 方法中出现 fatal error : Using JNIEnv in non-java thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23962972/

相关文章:

gradle - 如何在Android Studio中使用我自己的Android.mk文件

java - Android JNI 调用方法 GetStringUTFLength 崩溃

java - 如何使文本区域文本在行结束时自动转到下一行?

android - 从 Android 应用程序向 Facebook 提交高分时遇到问题

opencv - 代码未使用android ndk显示灰度图像

java - Android 中的 AboutToQuit 信号/事件

Android:如何从 JNI 代码中使用现有的 C++ 静态库?

java - 如何连接到在 Docker 中运行的远程 Cassandra 实例以使用 Java 检索数据?

java - Hibernate 查询示例 (QBE) 检查所有字段为空以确保安全

Java 同步列表