UnsatisfiedLinkError при использовании JNI? - PullRequest
6 голосов
/ 28 марта 2012

Я хочу вызвать C-программу из Java-программы, используя JNI в Linux Ubuntu.

Я новичок в этом, и я попробовал пример программы, приведенной в http://www.ibm.com/developerworks/java/tutorials/j-jni/section2.html.Я уже создал файлы .java, .h, .c и .so.Но когда я пытался запустить программу, я получаю следующую ошибку:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no Sample1 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1028)
    at Sample1.main(Sample1.java:13)

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Я только что попытался заставить тот же самый пример работать на моем CentOS и получил ту же ошибку, что и вы.Как уже было сказано, JVM не удалось найти нужный файл.Мне удалось заставить его работать, выполнив следующие шаги, используя gcc:

$ javac Sample1.java
$ javah Sample1
$ # Include paths must also be specified using -I option in the following gcc command line!
$ gcc -shared -I...snip... Sample1.c -o libSample1.so
$ # Library path for libSample1.so must also be specified!
$ java -Djava.library.path=...path/to/libSample1.so... Sample1

Если вы пропустите префикс "lib" разделяемой библиотеки, JVM по какой-то причине не сможет его найти.Я не знаю почему.Я не знаком с соглашением об именах разделяемых библиотек в Linux.

Надеюсь, этот пост может помочь.

3 голосов
/ 28 марта 2012

Это исключение указывает на то, что .so недоступен для JVM.

Добавление каталога, в котором существует .so, к LD_LIBRARY_PATH разрешит эту проблему.Если .so зависит от других библиотек .so, каталоги, в которых эти .so существуют, также необходимо добавить в LD_LIBRARY_PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...