Jython UnsatisfiedLinkError при вызове собственного метода в общей библиотеке - PullRequest
5 голосов
/ 19 октября 2011

Во-первых, вот что работает , а затем я опишу, что не так: Используя SWIG, мы взяли какой-то сторонний код и создали исходный код оболочки Java и C.Был создан JAR-файл классов Java и общая библиотека кода оболочки C.У нас есть кодовая база Java, которая загружает разделяемую библиотеку и способна вызывать собственный код по мере необходимости.Это работает на Sun HostSpot JVM 1.5.0.14.Не беспокойтесь.

Теперь, это не работает : при использовании той же JVM, файла jar с кодом оболочки Java и той же общей библиотеки, описанной выше, я пытаюсь использовать Jythonсделать некоторые сценарии.Переменные среды CLASSPATH и LD_LIBRARY_PATH установлены правильно.Из Jython я могу запустить java.lang.System.loadLibrary (...) и загрузить общую библиотеку без ошибок.Однако, когда первый собственный метод из этой библиотеки, который вызывается для объекта Java в моем скрипте Jython, я получаю UnsatisfiedLinkError от JVM.

Я запустил nm в общей библиотеке,и я вижу, что рассматриваемый метод присутствует в библиотеке (с именем искажения для собственных методов, как описано в спецификации JNI).Итак, вопрос в том, что может помешать JVM разрешить имя метода?

Я прошел через спецификацию JNI и вижу, что библиотека может быть выгружена GC.Может ли это случиться до того, как я вызову метод?Что еще может привести к сбою?

1 Ответ

0 голосов
/ 20 ноября 2012

У меня была эта проблема раньше.В моем случае загружаемая библиотека DLL / .so имела дополнительные зависимости, которые не были найдены, и в сообщении об ошибке сообщалось только о библиотеке, которую я пытался загрузить.Я использовал приведенные ниже инструменты для определения отсутствующих зависимостей.

Если вы работаете в Windows, используйте Process Monitor http://technet.microsoft.com/en-us/sysinternals/bb896645, чтобы увидеть точные библиотеки DLL, которые ищет ваше приложение.Вам нужно будет запустить Process Monitor, затем запустить ваше приложение и отфильтровать журналы, чтобы увидеть, какие библиотеки ищет ваше приложение.

Если вы используете Linux, используйте strace (http://en.wikipedia.org/wiki/Strace) и посмотритекакая общая библиотека отсутствует.

...