在Java程序中加载Native/Dynamic DLL

来源:互联网 发布:网络推广文案分析 编辑:程序博客网 时间:2024/06/05 05:24

虽然很少或者说Java本身也不推荐用Java去调用Native/Dynamic DLL,但是Java还是提供了该功能,以方便开发人员可以利用Navtive code去更好的实现Java不能实现的功能(比如效率原因或者很多老的代码)。

有好几种方法可以让JAVA在运行过程中找到并加载DLL:

1. Call System.load去加载dll (绝对路径)

import com.chilkatsoft.CkZip;public class Test {  static {    try {    System.load("C:/chilkatJava/chilkat.dll");    } catch (UnsatisfiedLinkError e) {      System.err.println("Native code library failed to load.\n" + e);      System.exit(1);    }  }  public static void main(String argv[])   {    CkZip zip = new CkZip();    System.out.println(zip.version());      }}

2. 复制DLL 到 java.library.path中的任何一个路径当中

首先查看当前的路径有哪些,比如在DOS命令下 echo %PATH%或者利用下面的代码去查看

String property = System.getProperty("java.library.path");StringTokenizer parser = new StringTokenizer(property, ";");while (parser.hasMoreTokens()) {    System.err.println(parser.nextToken());    }

Note: Java.library.path的初始化值包含了PATH, 只不过文件夹的先后顺序可能不一样,当然当前路径肯定在Java.library.path里面,但是不一定在PATH里面。

如果要加载的dll在这些目录下的任何一个,则跟方法1比较,不需要绝对路径,

import com.chilkatsoft.CkZip;public class Test {  static {    try {        System.loadLibrary("chilkat");        } catch (UnsatisfiedLinkError e) {      System.err.println("Native code library failed to load.\n" + e);      System.exit(1);    }  }  public static void main(String argv[])  {    CkZip zip = new CkZip();    System.out.println(zip.version());}  }

3.修改PATH环境变量,增加DLL所在的目录

修改环境变量的方式有几种,但是并不是所有的方式在Run-Time都是有效的。

通过控制面板修改环境变量是有效的,不过不同的操作系统在修改环境变量的时候界面不一样,

注意: 通过DOS 命令去修改PATH (set PATH=c:\childJava;%PATH%)是无效的,同时通过以下Java程序去修改PATH也是无效的,

  static {    try {    // Adding a directory to java.library.path here will not change anything.    // System.loadLibrary will still look in the directories listed in java.library.path    // as it existed at the very start of the program.    // The extra directory path added to java.library.path will not    // be searched by loadLibrary.        String libpath = System.getProperty("java.library.path");    libpath = libpath + ";C:/chilkatJava";    System.setProperty("java.library.path",libpath);        System.loadLibrary("chilkat");        } catch (UnsatisfiedLinkError e) {      System.err.println("Native code library failed to load.\n" + e);      System.exit(1);    }  }

4. 启动java程序的时候通过DOS命令并且利用选项-D 去设置java.library.path.

java -Djava.library.path=c:\chilkatJava  TestAPP 

5. 如果是Eclipse进行调试则在Eclipse里设置Java.library.path

在Eclipse右键 project,选择properties, 然后选择Run/Debug Settings, 然后选择tab页"Arguments",在该页面中的VM Arguments编辑框中增加 

“-Djava.library.path="c:\chilkatJaa;${env_var:PATH}"”,其中 c:\chilkatJava文件夹下包含chilkat.dll

总结:

通过上述的几种方法,实际上都是修改的Java.library.path,由于在启动java程序的时候,对该变量的加载只有一次(具体可以查看JDK 源代码),在启动后修改都是无效的,你会发现所有有效的修改都是在启动java application之前完成的。

原网址https://www.chilkatsoft.com/java-loadlibrary-windows.asp









阅读全文
0 0
原创粉丝点击