2010-10-07 2 views
0

Я пытаюсь создать и запустить пример jni-программы. Программа - всего лишь образец программы helloworld. Я не писал это, но я предполагаю, что он работает. Я запускаю это в Linux. Есть четыре файла.Ошибка выполнения Java с JNI

HelloNative.c 
HelloNative.h 
HelloNative.java 
HelloNativeTest.java 

Для создания файлов, я

gcc -I/myDir/jdk/include -I/myDir/jdk/include/linux -fPIC -c HelloNative.c 
gcc -shared -o HelloNative.so HelloNative.o 
java *java 

Вот результат сборки

HelloNative.c 
HelloNative.h 
    HelloNative.o 
    HelloNativeTest.class 
HelloNative.class 
HelloNative.java 
HelloNative.so 
HelloNativeTest.java 

Тогда я сделал

setenv LD_LIBRARY_PATH /myDir/myExample:${LD_LIBRARY_PATH} 
java HelloNativeTest 

Я получил следующее сообщение об ошибке

Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path 
     at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734) 
     at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
     at java.lang.System.loadLibrary(System.java:1028) 
     at HelloNative.<clinit>(HelloNative.java:9) 
     at HelloNativeTest.main(HelloNativeTest.java:8) 

Я проверил LD_LIBRARY_PATH и HelloClassTest и HelloNative.so, они все были там. Я также попытался указать -CLASSPATH, но это, похоже, не имело значения. У кого-нибудь есть идеи?

+0

Прежде всего, вы не должны иметь файлы C имеют такое же имя, что и файлы Java. Там –

+0

Файлы были из учебного пакета. Я не изменял и не переименовал их. Я предполагаю, что они работают так, как есть. Я мог бы попытаться изменить и переименовать их.Вы уверены, что это проблема? – tadpole

+0

Это может быть хорошей идеей рассказать людям, где они могут загрузить образец, чтобы они могли попробовать. Также вы вообще что-то модифицировали из образца? –

ответ

0

Сделайте следующее, где X = "HelloNative".

  • Дайте библиотеке имя файла, соответствующего системному стандарту. В Linux укажите свою библиотеку libX.so.
  • Установить системное свойство java.library.path в каталог, содержащий вашу библиотеку.
  • Звоните System.loadLibrary("X") где «X» - это кросс-платформенная часть указанной выше библиотеки.

Вы назвали свою библиотеку HelloNative.so; изменить его libHelloNative.so.

http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp679 От:

Аргумент System.loadLibrary является библиотека имени выбирается произвольно программиста. Система соответствует стандарту , но подходит для платформы, , чтобы преобразовать имя библиотеки в имя родной библиотеки. Например, система Solaris преобразует имя pkg_Cls в libpkg_Cls.so, тогда как система Win32 преобразует имя pkg_Cls в pkg_Cls.dll.

Если вы используете OSGi в будущем, есть альтернатива настройки java.library.path.

+0

Да, спасибо Энди. Изменение HelloNative.so на libHelloNative.so сделало трюк. – tadpole

0

Вы также можете попробовать, установив java.library.path:

java -Djava.library.path=/myDir/myExample HelloNativeTest 
+0

Этот вариант не имеет никакого значения. – tadpole

0

ли вы сделать System.loadLibrary() из Java?

+0

Как я уже сказал, это прямо из пакета учебных пособий Sun Java. Я полагаю, они знают, что они делают. Я проверил, и у них был класс HelloNative {public static native void greeting(); static {System.loadLibrary ("HelloNative"); } } – tadpole

+0

Ожидается, что библиотеки Linux начнут с «lib». Попробуйте переименовать в libHelloNative.so? – Jonathan

Смежные вопросы