Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JVM嵌入C++;应用:如何正确链接? 目标 我们假设有一个大型C++应用程序,它做一些大的事情,这是很好的,用C++来完成。但是,有很多逻辑,我们更愿意在JVM上运行 问题_Java_C++_Java Native Interface_Native - Fatal编程技术网

Java 将JVM嵌入C++;应用:如何正确链接? 目标 我们假设有一个大型C++应用程序,它做一些大的事情,这是很好的,用C++来完成。但是,有很多逻辑,我们更愿意在JVM上运行 问题

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

为了测试上面描述的方法,我使用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.8显示了一些不同的故障:

Error occurred during initialization of VM
Unable to load native library: Can't find dependent libraries
我还尝试了来自的不同版本,在
env->FindClass
调用中得到的最好结果是SEGFAULT

问题 JVM在嵌入到C++ + 中的使用效果更好?
  • 如何正确地链接和分发这些信息
  • 什么样的JVM分布更适合嵌入C++? 嵌入没有什么区别,因为其中很大一部分只是OpenJDK代码,有一些小的调整

    如何正确地链接和分发这些信息

    使用刚刚创建的exe将$JAVA_HOME中的所有DLL复制到目录中

    这是行不通的,因为JVM需要更多

    您必须分发JDK的一部分,只有DLL是不够的,因为缺少所有类库。您可以尝试使用
    jimage
    构建较小的图像。这将包括所有相关部分(=JVM、类库、本机库)

    要链接到JVM,请使用正确的方法。

    Windows解决方案:

  • 编写C++代码:
  • 包括来自JDK的
  • 使用WinAPI中的
    LoadLibrary
    加载“${JRE_HOME}/bin/server/jvm.dll”
  • 使用WinAPI中的
    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