我是否可以保证每个使用 JNI 的进程只有一个 JavaVM?

Cor*_*ica 3 c java java-native-interface jvm

我有一个通过 JNI 从 Java 应用程序使用的 C 共享库。我需要存储一些计算成本高昂的数据,这些数据在JavaVM. 我想将它存储static在 C中的一个变量中,以便它只计算一次。

当然,如果我的库可以JavaVM在同一进程中从多个s 中使用,这将失败。我的静态值仅在第一个JavaVM. 如果我的库是通过类上的System.loadLibrary一个static块从 Java 加载的,是否有可能在多个 JavaVM 之间使用所述库而不必完全卸载我的 C 共享库?

apa*_*gin 6

是的。大多数流行的 JVM 实现,特别是 HotSpot JVM 及其衍生产品,每个进程只允许一个 Java 虚拟机。

事实上,在一个进程中允许多个 VM 的实现将不符合 JNI 规范,因为JNI_CreateJavaVMJNI_GetCreatedJavaVMs的文档明确指出

不支持在单个进程中创建多个 VM。

  • 但我对将特定实现的不足之处写入规范的概念感到困难。特别是定义一个API来查询“所有已创建的Java VM”,然后在其文档中写入只能有一个。 (3认同)