UnsatisfiedLinkError ao usar o JNI?

Eu quero chamar um programa C do programa Java usando JNI no Linux Ubuntu.

Eu sou novo nisso e tentei o programa de exemplo fornecido em http://www.ibm.com/developerworks/java/tutorials/j-jni/section2.html . Eu já criei os arquivos .java, .h, .c e .so. Mas quando eu tentei executar o programa estou recebendo o seguinte erro.

  Exceção no segmento "main" java.lang.UnsatisfiedLinkError: no Sample1 in java.library.path
     em java.lang.ClassLoader.loadLibrary (ClassLoader.java:1738)
     em java.lang.Runtime.loadLibrary0 (Runtime.java:823)
     em java.lang.System.loadLibrary (System.java:1028)
     em Sample1.main (Sample1.java:13) 

Esta exceção está indicando que o .so não está disponível para a JVM.

Adicionar o diretório onde o .so existe ao LD_LIBRARY_PATH resolverá isso. Se o .so depender de outras bibliotecas .so os diretórios onde estes também existem também precisarão ser adicionados a LD_LIBRARY_PATH .

Acabei de tentar obter a mesma amostra para trabalhar no meu CentOS e recebi o mesmo erro que você. Como já foi respondido, a JVM não conseguiu encontrar o arquivo necessário. Consegui fazê-lo funcionar seguindo os passos abaixo usando o 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 

Se você omitir o prefixo “lib” da biblioteca compartilhada, a JVM não conseguirá encontrá-lo por algum motivo. Eu não sei porque. Não estou familiarizado com a convenção de nomenclatura de bibliotecas compartilhadas no Linux.

Espero que este post possa ajudar.