与 JNI 相比,JNA 似乎更容易用来调用本机代码。在什么情况下您会使用 JNI 而不是 JNA?
- JNA 不支持 C++ 类的映射,因此如果您使用 C++ 库,则需要 jni 包装器
- 如果你需要大量的内存复制。例如,您调用一个方法,该方法返回一个大字节缓冲区,您更改其中的某些内容,然后您需要调用另一个使用该字节缓冲区的方法。这需要您将此缓冲区从 c 复制到 java,然后将其从 java 复制回 c。在这种情况下,jni 将在性能上获胜,因为您可以在 c 中保留和修改此缓冲区,而无需复制。
这些是我遇到的问题。也许还有更多。但一般来说,jna 和 jni 的性能差别不大,所以只要能使用 JNA 的地方,就使用它。
EDIT
这个答案似乎很受欢迎。所以这里有一些补充:
- If you need to map C++ or COM, there is a library by Oliver Chafic, creator of JNAerator, called BridJ https://github.com/nativelibs4java/BridJ. It is still a young library, but it has many interesting features:
- 动态 C / C++ / COM 互操作:调用 C++ 方法,创建 C++ 对象(以及来自 Java 的 C++ 类的子类!)
- 直接的类型映射,很好地使用泛型(包括更好的指针模型)
- 完整的 JNAerator 支持
- 适用于 Windows、Linux、MacOS X、Solaris、Android
- 至于内存复制,我相信JNA支持直接ByteBuffers,因此可以避免内存复制。
因此,我仍然认为,只要有可能,最好使用 JNA 或 BridJ,如果性能至关重要,则恢复到 jni,因为如果需要频繁调用本机函数,性能损失会很明显。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)