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

时间:2013-08-27 17:02:07

标签: c++ multithreading java-native-interface

我正在JNI中使用C ++作为我的本地人。我能够创建(c ++)共享库,并且我可以在共享库的帮助下调用java函数。

我的流程涉及的步骤:

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

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

3)退出线程

如果我将再次执行相同的过程,JNI_CreateJavaVm不会创建任何VM,并且它将JNI错误代码返回为-1(未知错误)。然后我检查getCreatedJavaVMs返回值,返回0,同时我尝试获取带有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。

2 个答案:

答案 0 :(得分:4)

在一个线程中,您应该只在程序开头创建一个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");

答案 1 :(得分:3)

您可以使用AttachCurrentThread()将当前线程附加到现有Java VM。不需要为每个线程创建JavaVM。