【问题标题】:UnsatisfiedLinkError with JACOB and jre 1.7带有 JACOB 和 jre 1.7 的 UnsatisfiedLinkError
【发布时间】:2013-04-11 05:15:30
【问题描述】:

我编写了一个使用 JACOB 访问 iTunes 的程序......它在 Eclipse 中运行良好,但是当我导出它并在命令提示符下运行它时,我收到一个不满意的链接错误,告诉我 jacob-1.17-M2-x86 .dll 不在我的 java.library.path 中。

我尝试将其放入 system32,将本机库位置设置为其目录...我尝试使用 system.setproperties 技巧...但我无法弄清楚如何正确使用 java -d

我还能做什么?我在网上搜索了 4 个多小时试图使其兼容,但似乎没有任何效果。

【问题讨论】:

    标签: java path libraries unsatisfiedlinkerror jacob


    【解决方案1】:

    我发现了一个来自 sun 程序员的精彩帖子,解决了我的问题!

    public static void addDir(String s) throws IOException {
        try {
            // This enables the java.library.path to be modified at runtime
            // From a Sun engineer at http://forums.sun.com/thread.jspa?threadID=707176
            Field field = ClassLoader.class.getDeclaredField("usr_paths");
            field.setAccessible(true);
            String[] paths = (String[])field.get(null);
            for (int i = 0; i < paths.length; i++) {
                if (s.equals(paths[i])) {
                    return;
                }
            }
            String[] tmp = new String[paths.length+1];
            System.arraycopy(paths,0,tmp,0,paths.length);
            tmp[paths.length] = s;
            field.set(null,tmp);
            System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + s);
        } catch (IllegalAccessException e) {
            throw new IOException("Failed to get permissions to set library path");
        } catch (NoSuchFieldException e) {
            throw new IOException("Failed to get field handle to set library path");
        }
    }
    

    然后我在使用 JACOB 方法之前添加了

    addDir("C:" + File.separator + "java" + File.separator + "jre7" + File.separator + "lib")
    

    工作就像一个魅力。

    【讨论】:

      【解决方案2】:

      另一种解决方法:

      就在您尝试加载文件之前,转到 ClassLoader.java (java\lang\ClassLoader.java)。在以下行设置断点:

      File libfile = new File(sys_paths[i], System.mapLibraryName(name));
      

      那个函数位于function:

      static void loadLibrary(Class<?> fromClass, String name, boolean isAbsolute) 
      

      当您执行断点并使用 IntelliJ 时,您会注意到它正在寻找的灰色路径。我的路径是C:\Program Files\Java\jdk1.8.0_161\jre\bin。当您将所需的 DLL 文件放在那里时,它就可以工作了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多