我正在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。
答案 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。