Java .NET互操作性

Nag*_*ini 7 c# java ikvm interop jni4net

我正在开发一个.NET网站,在Parallel Plesk Panel(Windows)上托管,我有一些用Java编写的类,我想在我的网站上使用它的swing和JavaMail API.我有两个选择 - jni4net和IKVM.net.只想知道在性能和开发方面哪一个是高效便捷的方法?

Ste*_*Fan 7

jni4net 更小(二进制大小为1.5MB),并且具有更好的占用空间 - 但由于最后一次存储库更新于2013年11月执行,因此开发可能已停止,项目已被放弃,但它仍然存在持有Alpha阶段,因此它不成熟,复杂,需要做更多的工作才能使用它,BTW,jni4net正在使用LGPL,所以如果你想在你的商业产品中使用它将是一个非常大的问题.

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窗口环境中运行这两个平台,具有2个通用3.4 GHz CPU和2G DDR3内存),我的结果是,JVM在692ms内完成,内存使用量为9MB,而IKVM.net,可以使用大约4923毫秒,内存占用19MB,打印出一个很酷的"Hello World!" 仅报价!如果我将Java类编译成预编译的IL(ikvmc),可以将时间量减少到大约1907ms,并且内存使用量与JIT相同.

相比之下,对于JVM和IKVM.net(JIT),JVM在竞争对手中占据了大约7倍的时间和2倍的内存,对于JVM和IKVM.net(预编译),JVM仍然领先对于竞争对手,内存的2.7倍和1.11倍,而对于IKVM.net(JIT)和IKVM.net(预编译),它将为您提供双倍的提升,并且内存占用没有差异,尽管它们仍然比JVM更慢更胖.

还有另一个问题,预编译的IKVM.net存根必须随处携带整个IKVM.net二进制文件,然后包大小增加约41MB,我不知道是否可以剥离一些未使用的库,但在大多数情况下,我们不会这样做.

对于jni4net,用于打印"Hello World"的时间大约1567ms,从CLR到JVM,从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 Framework并享受其余的(但您只能运行Java SE).

为了回答你的问题,根本没有好的解决方案 - jni4net和IKVM.net,实际上两个完全不同,但如果你想强制结论,我想使用IKVM.net -它仍然活跃,强大,可扩展,但又胖又慢.