9

从 Java 调用本机库的最快方法是什么?

我所知道的是

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

4 回答 4

12

Swig也使 JNI 更容易。

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

于 2009-04-08T16:20:20.583 回答
10

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

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

于 2009-04-08T16:20:39.037 回答
3

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

恐怕您可能找不到可靠的基准来准确衡量您的需求。

于 2009-04-08T19:54:52.627 回答
2

这篇博客文章声称由于 JNA 使用的自省机制,它会比 JNI 慢得多。我怀疑 NativeCall 将使用类似的机制,从而以类似的方式执行。

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

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

于 2009-04-08T16:22:21.123 回答