如何在多线程环境中使用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"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |