java - 将 JVM 嵌入到 C++ 应用程序中 : How to link it properly?

标签 java c++ java-native-interface native

目标

比方说,我们有一个大型 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。

问题

  1. 哪种 JVM 发行版更适合用于嵌入 C++?
  2. 如何正确链接和分发它们?

最佳答案

Windows 解决方案:

  1. 编写 C++ 代码:
    1. 包括<jni.h>来自 JDK。
    2. 使用 LoadLibrary 加载“${JRE_HOME}/bin/server/jvm.dll”来自 WinAPI。
    3. 获取指向JNI_CreateJavaVM的指针使用GetProcAddress来自 WinAPI。
    4. 调用 JNI_CreateJavaVM并用 JVM 做任何你想做的事。
  2. 编译它并访问 ${JAVA_HOME}/include/**/*.h .
  3. 只需运行编译后的程序即可。

此处的工作示例:https://bitbucket.org/kkolyan/j4cpp/src/master/

关于java - 将 JVM 嵌入到 C++ 应用程序中 : How to link it properly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63223094/

相关文章:

c++ - 与 openmp 的 10 维蒙特卡洛集成

c++ - 分配给被移动的 std::function 是否合法

java - 安卓 JNI OutOfMemoryError

c - 就性能和共享库文件而言, "compiled for an architecture"与 "compiled on a machine"一样好吗?

java - Android RSS 阅读器 - 教程错误

c# - 从 android 连接 wcf 服务时出错。错误: Failed to connect to/10. 0.2.2

java - 用于显示 java 图形用户界面 (gui) 的库或质量教程。对于德州扑克游戏

c++ - tcmalloc:静态编译时如何覆盖我的 malloc 调用?

java - JNI GetMethodID 在 native 线程中导致错误

java - 使用 Truezip 将新文件添加到 zip 存档