Java 调用原生动态链接库(搜索)

java 调用原生动态链接库,在windows上即为调用 .dll ,在 *nix 系统上即为调用 lib.so 。

JNI

全称Java Native Interface,即Java本地接口,它提供一套能与其它语言通信的API,主要是C(C++)
这里写图片描述
可 见步骤非常的多,很麻烦,使用JNI调用.dll/.so共享库都能体会到这个痛苦的过程。如果已有一个编译好的.dll/.so文件,如果使用JNI技 术调用,我们首先需要使用C语言另外写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的 dll/so中公布的函 数。然后再在Java中载入这个库dll/so,最后编写Java native函数作为链接库中函数的代理。经过这些繁琐的步骤才能在Java中调用 本地代码。因此,很少有Java程序员愿意编写调用dll/.so库中原生函数的java程序。这也使Java语言在客户端上乏善可陈,可以说JNI是 Java的一大弱点!

可以用 gluegen swig 生成C代码

JNA

全称Java Native Access,使用JNA比JNI简单许多,我们只需要在Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射,调用起来感觉就像在调用Java代码一样方便。使用JNA需要两个架包,即jna-4.1.0.jar与jna-platform-4.1.0.jar,这样就行了。
这里写图片描述
原理:JNA使用一个小型的JNI库插桩程序来动态调用本地代码。开发者使用Java接口描述目标本地库的功能和结构,这使得它很容易利用本机平台的功能,而不会产生多平台配置和生成JNI代码的高开销。这样的性能、准确性和易用性显然受到很大的重视。

而JNA只能实现Java访问C函数,作为一个Java框架,自然不能实现C语言调用Java代码。此时,你还是需要使用JNI技术。

SWIG

SWIG(Simplified Wrapper and Interface Generator) 为你自动生成了这个冗长的wrapper文件和相应的Java类,其中还妥善完成了类型转换,函数指针、模板这些C++功能在其他语言中的转换等诸般工作,善举阿。
用swig方式封装的,因为直接使用的是jni技术,理论上应该比jna的快100倍,比bridj的也快几倍。

bridJ

bridj 基于 jna,Pointer <—> char*,贴近C底层,Java方调用较不方便。
可以用 jnagenerator 根据对应的 *.h 来生成 java interface

JNative

使用 dll 的函数名直接调用,有默认对应关系, 自己处理参数与返回值

猜你喜欢

转载自blog.csdn.net/u013179884/article/details/81047646