当前位置: 首页 > 知识库问答 >
问题:

GraalVM生成的本机映像可以替代IKVM生成的DLL吗?

都超英
2023-03-14

我有一些Java应用程序和一个客户,他们有一些UWP应用程序,用C#实现,通过Windows商店等分发,他们想使用我的应用程序的一些部分。这些部分完全独立于操作系统,只解析一些特殊的二进制文件格式,应用一些使用YAML文件和东西配置的业务逻辑。没有网络、GUI,只有一些文件访问等。

我们目前使用IKVM使C#可以使用感兴趣的代码,但已经遇到了不同的问题。有些支持.NET核心,有些与发行版中的本机工具链等有关。虽然在应用了一些变通方法后,目前情况似乎正常,但我已经在寻找IKVM的替代方案。

我目前使用IKVM的唯一一件事就是用ikvmc创建一个我的代码的DLL,它可以在UWP项目中被引用。编译器总结如下:

ikvmc工具将Java字节码转换为.NET dll和exe。

这就是我想到的支持创建GraalVM的本机Windows映像的地方。其他人似乎已经为Windows构建了本机二进制文件,根据文档,GraalVM能够使用“-共享”创建共享库。据我所知,IKVM在. NET中实现了一个JVM,并根据需要和可能映射事物。这听起来很像“基板VM”在本机映像的情况下所做的,不是吗?

该可执行文件包括应用程序、库、JDK,并且不在JavaVM上运行,但包括必要的组件,如内存管理和来自不同虚拟机的线程调度,称为“基板VM”。基板VM是运行时组件的名称(如解优化器、垃圾收集器、线程调度等)。

https://www.graalvm.org/docs/reference-manual/native-image/

那么,DLL形式的本机映像是否有可能取代当前由ikvmc创建的DLL?有人已经尝试过并有过任何经验吗?有人已经尝试过创建本机DLL并在其他本机Windows应用程序中使用它吗?根据我的理解,UWP“仅”应用额外的限制,这些限制可能会再次解决。或者由于某些原因,这种方法完全不可能吗?

谢谢大家的投入!

共有2个答案

竺展
2023-03-14

与IKVM不同,GraalVM本机映像不太灵活。NET图像。除非您喜欢编写包装器和使用P/Invoke,否则您应该坚持使用IKVM.NET。

注意:我支持一个IKVM。网叉

欧阳翔
2023-03-14

我不太熟悉IKVM项目,所以这个答案主要是关于一般问题:

您可以创建本机DLL/共享库并在其他本机Windows应用程序中使用它吗?

这应该是可能的。您可以将 Java 代码编译到共享库中。入口点用@CEntrypoint批注标记。

然后,您可以使用生成的共享库和头文件从本机应用程序中使用库。

这样,例如GraalVM发行版默认使用GraalVM JIT编译器:

  1. GraalVM JIT是用Java编写的
  2. 使用本机映像编译为共享库
  3. 用于热点。

这是一个页面,描述了如何通过JNI从Java消费这些:https://www.graalvm.org/reference-manual/native-image/ImplementingNativeMethodsInJavaWithSVM/

这可能非常类似于您如何使用C#应用程序中的共享库。

 类似资料:
  • 失败:生成失败,出现异常。 错误:执行任务“:QuarkusBuild”失败。Io.Quarkus.Builder.BuildException:生成失败:由于错误导致生成失败[error]:生成步骤Io.Quarkus.Deployment.Pkg.Steps.NativeImageBuildStep#Build引发异常:java.lang.RuntimeException:未能在io.Quar

  • 我正在尝试将我的. jar项目转换为本地映像,因为我需要在不支持Java的设备中运行它。为此,我安装了GraalVM和所有必需的依赖项,本地映像构建工作完美(或者至少看起来是这样,因为它在过程中不会产生任何错误)。 我用于构建的命令是: /usr/lib/jvm/graalvm/bin/native image-jar-MyApp。jar MyApp——启用http——启用https——无回退——

  • 我正在尝试使用GraalVM构建本机Quarkus映像,但遇到以下构建失败错误: 这是我第一次与GraalVM合作,所以我有点困惑。 以下是基本信息:Java版本17 Graavl VM版本graalvm-ce-javaV-22.1.0 我按照提供的步骤:https://stackoverflow.com/a/65837409/7584240和https://github.com/graalvm/

  • 当我建立一个本土形象时,我面临着一个反思的问题 通用域名格式。神谕svm。主持。代替DeletedElementException:不支持的java字段。朗,同学们。newInstanceCallerCache是可访问的:此元素的声明类已被替换,但替换类中不存在此元素 我该怎么修?我的环境GraalVM 20和Zulu OpenJdk11 我的pom

  • 我无法在Catalina 10.15.2中运行命令: 它向我返回以下消息: 我试过跑步 哪里 没有运气。我无法运行该命令,因此无法成功运行该命令 mvn安装-Pnative。 [pastebin][1] 我已经读过这个[帖子][2],对我来说不起作用。 救命啊求你了 更新 好的,我已经应用了建议,现在我可以创建native-image,但是当我尝试运行mvn install-P本国时,我遇到了一个

  • 我正在尝试用GraalVM创建一个本地映像,我的代码是: 然后我把代码本身称为: 当我运行IDE或java-jar时,它可以正常工作,但当我尝试编译为本机映像时,会抛出一个错误。下面是用于编译本机映像的命令行。 错误: TypeError:invokeMember(打印)在JavaObject[com.compiler.commons.log]上。Console@113a2d320(com.com