2012-03-28 51 views
4

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

我是新来的,我试过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)
+0

它缺少一个名为“Sample1”的东西。确保共享对象已构建并位于指定的路径中。 – 2012-03-28 10:19:47

+0

@poonam Hoshi:请写下用于创建共享库和命令行的步骤/ LD_LIBRARY_PATH,用于将库传递给jvm .. – Jayan 2012-03-28 11:48:28

+0

你在哪里libSample.so和什么是你的LD_LIBRARY_PATH – jogabonito 2012-03-30 07:09:28

回答

3

此异常表明.so不可用的JVM。

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

+2

我试着设置库路径,但它仍然是不工作。我的Ubuntu版本是Ubuntu 10.04.4 LTS。我刚刚从其他一些网站了解到,在这个版本的ubuntu LD_LIBRARY_PATH中不再有效。请帮助解决这个问题。并感谢您的帮助。 – 2012-03-29 06:32:15

3

我刚刚试图让我的CentOS上使用同样的示例,并得到与您一样的错误。正如已经回答的那样,JVM无法找到所需的文件。我成功地得到它通过下面用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中共享库的命名约定。

我希望这篇文章可以帮助。

+0

谢谢你的回答,但我仍然无法解决这个错误。我的Ubuntu版本是Ubuntu 10.04.4 LTS。 – 2012-03-29 06:33:35

+0

在“-Djava.library.path = ...”中只有libSample1.so的路径,没有lib本身! – rmv 2013-11-30 11:12:58