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

Am I guaranteed to have exactly one JavaVM per process using JNI?

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

当然,如果我的库可能在同一进程中被多个 JavaVM 使用,那么这将失败。我的静态值仅在第一个 JavaVM 中有效。如果我的库是在 class 上的 static 块中通过 System.loadLibrary 从 Java 加载的,那么该库是否有可能在多个 Java 中使用]虚拟机无需完全卸载我的 C 共享库?

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

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

Creation of multiple VMs in a single process is not supported.