使用JACOB和jre 1.7的UnsatisfiedLinkError

时间:2013-04-11 05:15:31

标签: java path libraries unsatisfiedlinkerror jacob

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

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

我还能做什么?我一直在网上试图让这种兼容性超过4小时,似乎没有任何效果。

2 个答案:

答案 0 :(得分:0)

我找到了太阳程序员的一篇很棒的帖子来解决我的问题!

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")

像魅力一样工作。

答案 1 :(得分:0)

另一种解决方法:

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

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

该函数位于函数中:

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

在执行断点并使用IntelliJ时,您会发现灰色的路径在寻找。我的路径是C:\Program Files\Java\jdk1.8.0_161\jre\bin。当您将所需的DLL放在此处时,它将起作用。