UnsatisfiedLinkError - 从jar文件访问dll文件

时间:2013-11-14 08:21:11

标签: java java-native-interface

我正在使用 Netbeans 开发 Swing 应用程序。我正在为我的应用程序使用 dll文件 。 我使用了以下代码。它在IDE中运行完美。

但是在清理并在IDE中构建之后从jar文件运行时,它会显示以下错误。

Exception in thread "main" java.lang.UnsatisfiedLinkError: no win32com in java.l
ibrary.path
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at test.Test.main(Test.java:78)

我设置路径的代码..

private static void setPath() {
        try {
            System.setProperty("java.library.path", "./lib/win32/");
            Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
            fieldSysPath.setAccessible(true);
            fieldSysPath.set(null, null);

        } catch (IllegalAccessException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchFieldException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException e) {
        }
    }

我的主要方法......

...
    setPath();
    try {
        System.loadLibrary("win32com");
    } catch (Exception e) {
        System.out.println(e);
    }

我的文件夹结构..

enter image description here

1 个答案:

答案 0 :(得分:0)

要通过java代码()访问dll文件,必须执行以下操作

(在我的情况下,获取通讯端口列表并与其中一个建立连接)

  1. 将dll文件( win32com.dll )放入jre bin文件夹
  2. javax.com.properties 文件放在jre lib文件夹中。
  3. 虽然它运行良好,但是当你将它导出到Jar并尝试在其他机器上执行时,仍然必须确保dll和属性文件位于适当的位置。

    但是,作为Alternate,如果你将dll放在另一个位置,那么你必须在导出到Jar文件之前将库路径设置为VM选项。

    在Netbeans中,点击项目 - >右键单击属性 - >选择运行 - > 提供 VM选项,如

    -Djava.library.path="D:\My Project\lib\win32" 
    

    (如果dll文件位于D:\ My Project \ lib \ win32中)

    此外,您可以加载

    之类的驱动程序,而不是使用 javax.com.properties 文件。
       String driverName = "com.sun.comm.Win32Driver";
       CommDriver commdriver = (CommDriver) Class.forName(driverName).newInstance();
       commdriver.initialize();