Java.NET互操作性
本文关键字:互操作性 NET Java | 更新日期: 2023-09-27 18:20:18
我正在开发一个.NET网站,该网站将托管在Parallel Plesk Panel(Windows)上,我有一些类是用Java编写的,使用它的swing和JavaMail API,我想在我的网站中使用这些API。我有两个选择-jni4net和IKVM.net。我只想知道从性能和开发工作量来看,哪一个是高效方便的方法?
jni4net小得多(1.5MB的二进制大小),占地面积更好——但开发可能会停止,项目已经放弃,因为上一次存储库更新是在2013年11月执行的,但它仍处于Alpha阶段,因此它不成熟、复杂,需要做更多的工作才能使用它,BTW,jni4net使用LGPL,因此如果您想在商业产品中使用is,这将是一个非常大的问题。
IKVM.net,AFAIK,是用CLR编码的Java Runtime的一个几乎完全实现(因为它实现的是OpenJDK,而不是Orcale Java,所以它有点坏)平台,它本身会JIT将Java字节码编译成IL,然后执行它,这类似于QEMU,但还有一个问题,我们遇到了三层,第一层是Java Runtime,然后是CLR和最后的本机代码。因此,它非常非常慢,另一个问题是初始时间问题。
例如,我写了一个Java程序,它只会打印著名的"Hello World"语录,然后退出,然后我想测试IKVM.net和Orcale JVM(简称JVM)能做多少毫秒(我在KVM窗口环境中运行这两个平台,有两个通用3.4 GHz CPU核和2G DDR3内存),我的结果是,JVM在692ms内完成,内存使用量为9MB,而IKVM.net可能使用约4923ms,内存占用量为19MB来打印一个很酷的"Hello World!"报价如果我将Java类编译成预编译的IL(ikvmc),可以将时间减少到大约1907ms,并且内存使用量与JIT相同。
相比之下,对于JVM和IKVM.net(JIT),JVM在时间上领先对手约7倍,在内存上领先对手2倍;对于JVM和IK VM.net(预编译),JVM在内存上仍领先对手约2.7倍和1.11倍尽管它们仍然比JVM慢且胖。
还有另一个问题,预编译的IKVM.net存根必须在任何地方都携带整个IKVM.net二进制文件,这大约是一个包大小的41MB增量,我不知道我是否可以去掉一些未使用的库,但在大多数情况下,我们不会这么做。
对于jni4net,从CLR到JVM,打印"Hello World"所用的时间大约为1567ms,从JVM到CLR呢?这有点奇怪,它使用了2106ms,我不知道为什么差异如此之大,可能是因为Java正在动态地从头开始创建CLR实例,而CLR可以直接P/Invoke静态地中的JNI。
总之,jni4net更有可能是CLR和JVM之间的代理——它既没有实现完整的Java环境,也没有模拟完整的CLR,而是通过现有资源创建JVM和CLR实例。对于IKVM.net,它更像是伪装在.net中的JVM,但你可以将Java代码注入CLR,而不能在Java端编译.net。它很慢,但它不再需要JVM。,你可以安装.net框架并享受其余的功能(但你只能运行Java SE)。
为了回答你的问题,根本没有好的解决方案——jni4net和IKVM.net实际上是两个完全不同的东西,但如果你想得出结论,我想使用IKVM.net——它仍然是活跃、强大、可扩展的,但胖而慢。