java.lang.UnsatisfiedLinkError: нет библиотеки в java.library.path

Я пытаюсь связать нативную библиотеку с моим подключаемым модулем Eclipse. Когда я указываю путь к библиотеке с помощью -Djava.library.path, он работает отлично.

Однако, когда я добавляю его в файл MANIFEST.MF, возникает исключение, в котором говорится:

Exception in thread "Thread-9" java.lang.UnsatisfiedLinkError: no XpNamedPipeJni in java.library.path

Код в MANIFEST.MF

Bundle-NativeCode: lib/XpNamedPipeJni.dll; lib/XpNamedPipeJni_64.dll; osname=Win32; processor=x86; processor=x86-64, lib/libXpNamedPipeJni.dylib; osname=MacOSX; processor=x86; processor=PowerPC; processor=x86-64

Самое смешное, что в винде с Bundle-NativeCode: lib/XpNamedPipeJni.dll; lib/XpNamedPipeJni_64.dll работает отлично. Проблема возникает, когда я добавляю еще одну строку для Mac OS. Я также пробовал Bundle-NativeCode: lib/libXpNamedPipeJni.dylib. Не работает.

Я испробовал все возможные перестановки значений ОС/процессор из здесь спецификаций OSGi.


person Rahul Jiresal    schedule 17.07.2012    source источник
comment
Как насчет использования псевдонима Mac OS X?   -  person Kane    schedule 17.07.2012
comment
Это странно. Вы можете попробовать добавить разрыв строки для библиотеки Mac OS X. И если ваш пакет работает только на Eclipse/Equinox, вы можете поместить свои библиотеки в следующую структуру папок, --os --win32 --x86 --XpNamedPipeJni.dll   -  person Kane    schedule 17.07.2012
comment
Но библиотека Mac работает как на платформах x86, так и на платформах x86_64. Создать две структуры папок как os/macosx/x86/lib.dylib, os/macosx/x86_64/lib.dylib? PS. Я добавил разрывы строк. Без изменений.   -  person Rahul Jiresal    schedule 17.07.2012
comment
В любом случае, ничего из вышеперечисленного не сработало. Есть ли что-то очевидное, что я упускаю?   -  person Rahul Jiresal    schedule 17.07.2012


Ответы (2)


Решил. Я использовал неправильное расширение библиотеки. Я изменил расширение с dylib на jnilib и все заработало. Судя по всему, виртуальная машина Java в OS X требует, чтобы расширение файла было .jnilib. Любые идеи о причине этого?

Теперь код выглядит просто

Bundle-NativeCode: lib/XpNamedPipeJni.dll; osname=Win32; processor=x86, lib/XpNamedPipeJni_64.dll; osname=Win32; processor=x86_64, lib/libXpNamedPipeJni.jnilib; osname=macosx; processor=x86; processor=x86_64; processor=ppc

person Rahul Jiresal    schedule 17.07.2012

Если ваше eclipse не может загрузить XpNamedPipeJni.dylib (или любое другое имя файла.dylib), это связано с тем, что eclipse пытается загрузить его из системы с помощью вызова System.loadLibrary(fileName), а eclipse не может чтобы найти его из мест загрузки, поскольку файл не существует в этих местах.

Чтобы увидеть, откуда все eclipse пытаются его загрузить, добавьте следующую строку в свой код:

String locations = System.getProperty("java.library.path");

просмотрите все места и скопируйте файл в любое из этих мест (если место не существует, создайте его и скопируйте). Перезапустите затмение, теперь оно будет работать нормально.

person abhijeet104    schedule 01.09.2017