3

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

我的过程中涉及的步骤:

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

2) 使用创建的虚拟机进行处理。

3) 退出线程

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

4

2 回答 2

4

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

/* Global instance */
JavaVM *jvm;

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

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

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

最后使用该环境,您可以访问方法/类等:

jclass ex = (*env)->FindClass(env, "java/lang/NullPointerException");
于 2013-08-27T17:10:59.203 回答
3

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

于 2013-08-27T17:06:50.313 回答