JNA(Java Native Access)
Sun官方的java本地访问项目(https://github.com/java-native-access/jna),是一个库,用它可以大大简化java调用本地库的过程。这个东西有点像windows的loadlibrary和linux下的dlopen,都是动态装在库,可以在运行时根据需要装在符合接口的库。
根据描述,使用方法如下:
编写符合函数原型的接口(interface),并根据调用方式选择是扩展StdCallLibrary接口(stdcall)还是Library接口(其他方式)。
编写动态库,并放至path下。C++请使用 extern "C" __declspec( dllexport ) 作为导出函数前缀,以免编译器的名称粉碎导致java调用不能。*
通过java的jna库的Native.loadlibrary()方法装载动态库。
之前我们也介绍了另一种技术JNI。
JNI(Java Native Interface)
JNI是java本地化的原始方法,是java与本地语言之间调用的桥梁。注意是之间,也就是说除了Java调用本地语言动态库,本地语言(不仅限于C、C++,还有诸如Delphi、VB等)同样也可以调用Java。
其实现步骤大致分四步:
编写java部分的接口代码,核心是声明native的方法,静态或实例级别均可。通过System.loadlibrary()指定需要调用的动态库名称。
生成二进制文件.class,并根据.class用javah生成对应的.h头文件。
编写本地代码,生成动态库。将动态库放至path变量的路径下,以供查找。
java完成调用。
JNI和JNA的区别
JNA是基于JNI的,是在JNI上封装了一层,JNI性能不如JNA。