使用JNI时出现UnsatisfiedLinkError?

时间:2012-03-28 10:15:22

标签: java c linux java-native-interface

我想在linux ubuntu中使用JNI从Java程序调用C程序。

我是新手,我尝试了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 个答案:

答案 0 :(得分:3)

此异常表示JVM无法使用.so

.so存在的目录添加到LD_LIBRARY_PATH将解决此问题。如果.so依赖于其他.so库,那么这些.so存在的目录也需要添加到LD_LIBRARY_PATH

答案 1 :(得分:3)

我刚试过让同样的样本在我的CentOS上运行并得到与你相同的错误。正如已经回答的那样,JVM无法找到所需的so文件。我通过使用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中共享库的命名约定。

我希望这篇文章有所帮助。