首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >本机方法中的致命错误:在非java线程中使用JNIEnv

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

Stack Overflow用户
提问于 2014-05-30 20:32:23
回答 1查看 1.8K关注 0票数 2

我正在实现一些JNI回调(本机-> java)功能,与另一个更大的本机框架一起使用。在该框架的回调中,我在尝试回调java时会遇到这个错误。

代码语言:javascript
运行
复制
FATAL Error in native method: Using JNIEnv in non-java thread

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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*指针。

代码语言:javascript
运行
复制
JNIEnv* AttachJava()
{
    JavaVMAttachArgs args = {JNI_VERSION_1_2, 0, 0};
    JNIEnv* java;
    jvm->AttachCurrentThread((void**) &java, &args);
    return java;
}

除非您确信JNIEnv*实例将在同一个线程中引用,否则不会保存的实例。

作为文献状态,在已经附加的线程上调用AttachCurrentThread是没有操作的,因此是无害的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23962972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档