加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在多线程环境中使用JNI_CreateJavaVm(C)

发布时间:2020-12-15 04:13:07 所属栏目:Java 来源:网络整理
导读:我正在使用C作为我的母语在JNI工作.我能够创建(c)共享库,并且我能够在共享库的帮助下调用 java函数. 我的流程涉及的步骤: 1)使用JNI_CreateJavaVm创建VM.[IN C] 2)使用创建的VM进行处理. 3)退出线程 如果我将再次执行相同的过程,JNI_CreateJavaVm不会创建任
我正在使用C作为我的母语在JNI工作.我能够创建(c)共享库,并且我能够在共享库的帮助下调用 java函数.

我的流程涉及的步骤:

1)使用JNI_CreateJavaVm创建VM.[IN C]

2)使用创建的VM进行处理.

3)退出线程

如果我将再次执行相同的过程,JNI_CreateJavaVm不会创建任何VM,并且它将JNI错误代码返回为-1(未知错误).然后我检查getCreatedJavaVMs返回值返回0,同时我尝试获取env GetEnv它崩溃了.

我也尝试了GetJavaVM函数,但它正在崩溃,错误信息,

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00c1b3ed,pid=8645,tid=2961177456
#
# JRE version: 7.0_25-b15
# Java VM: Java HotSpot(TM) Server VM (23.25-b01 mixed mode linux-x86 )
# Problematic frame:
# C  [libVsphere.so+0x6a3ed]  _Jv_JNIEnv::GetJavaVM(_Jv_JavaVM**)+0xb

为什么会这样,以及如何解决这个问题?

如何在多线程环境中使用JNI_CreateJavaVm,JNI_GetCreatedVMs和GetJavaVM.

解决方法

您应该只在一个线程中的程序开头创建一个JavaVM全局实例:

/* Global instance */
JavaVM *jvm;

int main() {
/* ...call to JNI_CreateJavaVm ...*/
}

然后在每个线程上如果你想获取Java环境,你应该使用指向java机器的全局指针(jvm):

JNIEnv *env;
(*jvm)->AttachCurrentThread(jvm,(void **)&env,NULL);

Finall使用该环境可以访问方法/类等:

jclass ex = (*env)->FindClass(env,"java/lang/NullPointerException");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读