Ошибка времени выполнения Java с JNI - PullRequest
0 голосов
/ 07 октября 2010

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

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, но это не имело значения. У кого-нибудь есть идеи?

Ответы [ 3 ]

0 голосов
/ 07 октября 2010

Вы делали System.loadLibrary () из Java?

0 голосов
/ 07 октября 2010

Сделайте следующее, где 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 голосов
/ 07 октября 2010

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

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