使用JNI时遇到UnsatisfiedLinkError错误?

6

我希望能用JNI在linux ubuntu中从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)

它缺少一个叫做“Sample1”的东西。确保共享对象已经构建并位于指定路径中。 - user166390
@poonam Hoshi:请写下创建sharelibrary所使用的步骤,并说明用于传递库至JVM的命令行/LD_LIBRARY_PATH。 - Jayan
你的libSample.so在哪里,LD_LIBRARY_PATH是什么? - bobby
2个回答

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中共享库的命名约定。
希望这篇文章能够帮助您。

1
谢谢您的回答,但我仍然无法解决这个错误。我的Ubuntu版本是Ubuntu 10.04.4 LTS。 - Poonam Hoshi
在“-Djava.library.path=…”中,只需包含libSample1.so的路径,不需要包含lib本身! - rmv

3

该异常表示JVM无法使用.so文件。

将包含.so文件的目录添加到LD_LIBRARY_PATH中可以解决此问题。如果.so文件依赖于其他.so库,则包含这些.so文件的目录也需要添加到LD_LIBRARY_PATH中。


3
我尝试设置库路径,但仍然无法运行。我的Ubuntu版本是Ubuntu 10.04.4 LTS。我刚从其他网站了解到,在这个Ubuntu版本中,LD_LIBRARY_PATH不再起作用。请帮忙解决问题。感谢您的帮助。 - Poonam Hoshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接