Java 将JVM嵌入C++;应用:如何正确链接? 目标 我们假设有一个大型C++应用程序,它做一些大的事情,这是很好的,用C++来完成。但是,有很多逻辑,我们更愿意在JVM上运行 问题
为了测试上面描述的方法,我使用CLion创建了。 情况是: 构建(由CMake自动完成):Java 将JVM嵌入C++;应用:如何正确链接? 目标 我们假设有一个大型C++应用程序,它做一些大的事情,这是很好的,用C++来完成。但是,有很多逻辑,我们更愿意在JVM上运行 问题,java,c++,java-native-interface,native,Java,C++,Java Native Interface,Native,为了测试上面描述的方法,我使用CLion创建了。 情况是: 构建(由CMake自动完成): 将代码片段链接到$JAVA_HOME/lib/jvm.lib 将所有DLL从$JAVA_HOME复制到刚创建的exe 运行: 创建嵌入式JVM 调用此JVM承载的静态方法 我尝试了VisualStudio2019社区和MinGW64(x86_64-8.1.0-posix-seh-rt_v6-rev0)工具链,两者都得到了相同的结果 使用OpenJDK()获得的最佳结果是: Oracle JDK 1
- 将代码片段链接到
$JAVA_HOME/lib/jvm.lib
- 将所有DLL从
复制到刚创建的$JAVA_HOME
exe
- 创建嵌入式JVM
- 调用此JVM承载的静态方法
Error occurred during initialization of VM
Unable to load native library: Can't find dependent libraries
我还尝试了来自的不同版本,在env->FindClass
调用中得到的最好结果是SEGFAULT
问题
JVM在嵌入到C++ + 中的使用效果更好?
jimage
构建较小的图像。这将包括所有相关部分(=JVM、类库、本机库)
要链接到JVM,请使用正确的方法。Windows解决方案:
LoadLibrary
加载“${JRE_HOME}/bin/server/jvm.dll”GetProcAddress
获取指向JNI\u CreateJavaVM
的指针JNI\u CreateJavaVM
并对JVM执行任何您想要的操作${JAVA_HOME}/include/***.h
编译它这里的工作示例:
不能将这两个进程分开作为一个进程,并且C++代码通过正常进程间通信策略调用java代码(例如REST Web服务、共享内存、同步原语等)吗?可能的副本:进程间通信是一个很好的解决方案,适用于大多数情况,并且易于实现。但这对我的情况来说还不够好,我对在同一个进程中运行JVM很感兴趣。@Orenishalom它不是重复的。链接中问题的作者问“如何让汽车开得更快”,但我的问题是“如何启动汽车发动机”。但是谢谢你的链接——我在寻找解决方案的时候没有看到它——它非常相关,也许有一些提示。我知道,我知道。这并不是您想要的(就像macOS一样),但我非常确定您可以使用类似的方法。本视频处理的情况完全相同——将JVM嵌入到应用程序包中。请看一看名为jlink
-它可能对您有用:谢谢!可以将整个JRE与应用程序一起携带。[1] 确保所有必需的东西(类库等)都能被eMeded JVM看到的正确方法是什么?[2] 我是否只需要保留分发中所有JRE文件之间的原始相对文件位置?[3] 然后,我似乎不能将DLL与EXE放在同一个文件夹中(至少因为JVM的DLL位于不同的文件夹中)。因此,我只能使用平台特定的方式手动加载DLL,如LoadLibrary
?[4] 我的EXE和JRE之间的相对路径对他们有意义吗?[1]——上面描述为答案。[2] ,[3]-是的。[4] -不,您可以从任何位置加载JRE。我在调试一些非常类似的代码时找到了这个答案。我试图在Unity中加载JVM。我看你也在做同样的事。不幸的是,您的示例和我自己的代码都无法工作。两者似乎都在实例化JVM时产生了这个错误:在执行本机代码时得到了一个SIGSEGV。想法?你在第二轮比赛中收到了这个SIGSEGV。对吗?这是因为每个进程只能启动一次JVM(任何已知JVM的限制)。对于Unity Editor,这意味着每个游戏运行都应该在创建之前首先尝试加入现有的JVM。永远不要手动破坏它。PS:是的,我用Unity+Java做过实验,并且用C#的反射风格编写了JVM。
Error occurred during initialization of VM
Unable to load native library: Can't find dependent libraries