【发布时间】:2020-08-03 02:49:51
【问题描述】:
目标
比方说,我们有一个大型 C++ 应用程序,它可以做一些大事情,这些事情最好用 C++ 来完成。但是,有很多逻辑,我们更愿意在 JVM 上运行。
问题
为了测试上述方法,我使用 CLion 创建了small C++ project。 场景是:
构建(由 CMake 自动生成):
- 链接代码sn-p 与
$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++ 中?
- 如何正确链接和分发?
【问题讨论】:
-
您不能将两者作为单独的进程运行,并让 c++ 代码通过正常的进程间通信策略(例如 REST Web 服务、共享内存、同步原语等)调用 Java 代码吗?跨度>
-
@MarcioLucca 是的,进程间通信是一个很好的解决方案,适用于大多数情况并且易于实现。但这对我的情况来说还不够好,我对在同一进程中运行 JVM 很感兴趣。
-
@OrenIshShalom 这不是重复的。您链接中问题的作者询问“如何更快地驾驶汽车”,但我的问题是“如何启动汽车的发动机”。但是感谢您的链接 - 在寻求解决方案时我没有看到它 - 它非常相关,也许有一些提示。
-
我知道,我知道。这并不完全是您正在寻找的东西(就像 macOS 一样),但我很确定您可以使用类似的方法。该视频处理完全相同的情况 - 将 JVM 嵌入您的应用程序包中。看看名为
jlink的东西 - 它可能对你有用:youtu.be/-DwcxuWXIgI
标签: java c++ java-native-interface native