java开发过程中会遇到需要调用c/c++动态库(windows平台的dll和linux平台的so)的情况,可以使用JNI或者JNA技术。
JNA基于JNI技术开发,主要在上层作了类型自动转换的封装,让开发人员极易使用,无需JNI那样的繁杂的接口层开发。
但是,JNI的调用效率要比JNA高得多,如果一个操作涉及到java虚拟机与外部动态库的频繁调用,且对程序执行效率有要求的话,还是建议使用JNI。反之建议使用JNA,例如一些低频的调用,但调用的动态库中进行了一系列复杂操作,最后返回一个结果。
1、Java加载dll或so库文件的路径 java.library.path
Java的System.load
和 System.loadLibrary
都可以用来加载库文件,loadLibray
需要设置路径System.getProperty("java.library.path");
System.loadLibrary ("TestJNI");//通过java.library.path获取动态库
System.load("C://Documents and Settings//TestJNI.dll"); //绝对路径
1) 在linux下添加一个java.library.path的方法如下:
在/etc/profile
后面加上一行 export LB_LIBRARY_PATH=路径
2) 使用默认的 java.library.path
打印当前系统的路径
System.out.println(System.getProperty("java.library.path"));
通常结果为结果为(以下结果仅供参考,需要自己运行后查看
):
/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
3) 在执行程序的时候可以显示指定, -Djava.library.path=路径
,这种会清除掉预设置的java.library.path的值 。实例如下:
java -jar -Djava.library.path=/home/test sound.war