GraalVM生成的本机映像能否替换IKVM生成的DLL?

时间:2019-10-28 17:08:56

标签: java c# ikvm graalvm graalvm-native-image

我有一些Java应用程序,并且有一个用户使用C#实现,通过Windows Store等分发了一些UWP应用程序,他们想要使用我的应用程序的某些部分。这些部分非常独立于操作系统,仅解析某些特殊的二进制文件格式,并应用使用YAML文件和内容配置的某些业务逻辑。没有网络,GUI,只有对文件的访问等。

我们目前使用IKVM使感兴趣的代码可用于C#,但已经遇到了其他问题。有些是supporting .NET Core,有些与native中的toolchain Release有关,依此类推。虽然现在在应用某些变通办法后似乎一切正常,但我正在寻找替代方法到IKVM已经有点了。

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

  

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

这就是创建GraalVM本机Windows映像的支持。其他人似乎已经为Windows和according to the docs构建了本机二进制文件,GraalVM能够使用“ --shared”创建共享库。据我了解,IKVM在.NET中实现了JVM,并根据需要和可能的情况映射了事物。听起来很像在本地映像的情况下“底物VM”的作用,不是吗?

  

此可执行文件包括应用程序,库,JDK和   不能在Java VM上运行,但是包含必要的组件,例如   来自其他虚拟机的内存管理和线程调度   机器,称为“底物VM”。底材VM是   运行时组件(如反优化器,垃圾收集器,线程   计划等)。

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

因此,是否有可能以DLL形式的本机映像替换当前ikvmc创建的DLL?有没有人尝试过并且有经验?是否有人尝试创建本机DLL并在其他本机Windows应用程序中使用它?据我了解,UWP“仅”应用了其他限制,这些限制可能可以再次解决。还是出于某些原因这种方法完全不可能?

感谢您的输入!

2 个答案:

答案 0 :(得分:1)

我对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#应用程序中使用共享库的方式非常相似。

答案 1 :(得分:0)

与IKVM.NET映像不同,GraalVM本机映像不是非常灵活。除非您喜欢编写包装程序并使用P / Invoke,否则应该坚持使用IKVM.NET。

注意:我在IKVM.NET分支后面