gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:13:59 27 4
gpt4 key购买 nike

我在 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。

最佳答案

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

关于c++ - 如何在多线程环境中使用 JNI_CreateJavaVm (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471478/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com