UnsatisfiedLinkError с JACOB и jre 1.7

Я собрал программу, которая использует JACOB для доступа к iTunes... Она отлично работает в Eclipse, но когда я экспортирую ее и запускаю в командной строке, я получаю сообщение об ошибке неудовлетворенной ссылки, сообщающее мне, что jacob-1.17-M2-x86.dll не в моем java.library.path.

Я пытался поместить его в system32, установив местоположение собственной библиотеки в свой каталог... я пытался использовать трюк system.setproperties... и я не мог понять, как правильно использовать java -d

Что еще я могу сделать? Я искал в Интернете, пытаясь получить это совместимо, более 4 часов, и, похоже, ничего не работает.


person Riptyde4    schedule 11.04.2013    source источник


Ответы (2)


Я нашел удивительный пост программиста 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")

Работал как шарм.

person Riptyde4    schedule 12.04.2013

Другой обходной путь:

Прежде чем пытаться загрузить файл, перейдите в 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, он будет работать.

person J. Doe    schedule 21.08.2018