目标
比方说,我们有一个大型 C++ 应用程序,它可以完成一些大型任务,而使用 C++ 来完成这些任务是很好的。但是,我们更愿意在 JVM 上运行大量逻辑。
问题
为了测试上述方法,我创建了 small C++ project使用 CLion。 场景是:
构建(由 CMake 自动执行):
- 将代码片段链接到
$JAVA_HOME/lib/jvm.lib
- 将
$JAVA_HOME
中的所有DLL复制到刚刚创建的exe
目录
运行:
- 创建嵌入式 JVM
- 调用此 JVM 托管的静态方法
我尝试了 Visual Studio 2019 Community 和 MinGW64 (x86_64-8.1.0-posix-seh-rt_v6-rev0) 工具链,两者都得到了相同的结果。
我使用 OpenJDK 获得的最佳结果 ( jdk-14.0.2 ):
Error occurred during initialization of VM
Failed setting boot class path.
Oracle JDK 1.8 显示了一些不同的故障:
Error occurred during initialization of VM
Unable to load native library: Can't find dependent libraries
我还尝试了 ojdkbuild 的不同版本我得到的最好的结果是 env->FindClass
调用中的 SEGFAULT。
问题
- 哪种 JVM 发行版更适合用于嵌入 C++?
- 如何正确链接和分发它们?
最佳答案
Windows 解决方案:
- 编写 C++ 代码:
- 包括
<jni.h>
来自 JDK。 - 使用
LoadLibrary
加载“${JRE_HOME}/bin/server/jvm.dll”来自 WinAPI。 - 获取指向
JNI_CreateJavaVM
的指针使用GetProcAddress
来自 WinAPI。 - 调用
JNI_CreateJavaVM
并用 JVM 做任何你想做的事。
- 包括
- 编译它并访问
${JAVA_HOME}/include/**/*.h
. - 只需运行编译后的程序即可。
关于java - 将 JVM 嵌入到 C++ 应用程序中 : How to link it properly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63223094/