哪种方法是从Java访问本机代码的最快方法?

时间:2009-04-08 16:13:59

标签: java java-native-interface native

哪种方法是从Java调用本机库的最快方法?

我所知道的是

  • NativeCall - 我们目前正在使用的
  • JNA - 没有使用它,但看起来很合理
  • JNI - 写起来很可怕,但如果我们得到速度,我们就会这样做

4 个答案:

答案 0 :(得分:12)

Swig也使JNI更容易。

就速度而言,我怀疑会有微妙的变化 - 我强烈建议你选择一个你知道你会做很多的电话,并对所提供的所有解决方案进行基准测试。

答案 1 :(得分:10)

JNI是最快的。与JNI相比,JNA非常慢(调用开销可能只有一个数量级),但它是一个很棒的库,因为它使本机访问变得如此简单。如果你需要偶尔调用一些原生API,JNA是很棒的。如果你关心性能,我不会在任何“紧密循环”中使用它。

我不确定NativeCall在频谱中的位置。

答案 2 :(得分:3)

相当多的参数会影响编程语言之间接口的性能:JVM运行的设备,开发者是谁(如果它不是通常的Sun JVM),是否需要从本机代码回调Java代码,操作系统上JVM的线程模型以及本机代码的异步性......

我可能找不到可靠的基准来衡量您的需求,我担心。

答案 3 :(得分:2)

This blog entry声称由于JNA使用的内省机制,它将明显慢于JNI。我怀疑NativeCall将使用类似的机制,因此以类似的方式执行。

但是,您应该根据您在Java和C之间引用和/或编组的特定对象进行基准测试。

我会赞同SWIG的建议。这使得Java / C接口的生活变得特别容易(更容易)。