Linux,java.lang.UnsatisfiedLinkError:no" library file"在java.library.path中

时间:2016-02-11 17:32:25

标签: java c++ linux java-native-interface unsatisfiedlinkerror

我试图运行一个简单的JNI示例,我运行一个通过动态库调用c ++函数的java应用程序。

我将发布以下代码和终端命令。

的.java

public class Lab{
   public native void hello();

   static {
      System.loadLibrary("hello");
   }

   public static void main(String args[]) {
      new Lab().hello();
   }
}

通过终端获取.class和头文件

javac Lab.java
javah -jni Lab

hello.cpp文件

#include "Lab.h"
#include <stdio.h>
#include <iostream>

JNIEXPORT void JNICALL Java_Lab_hello(JNIEnv *env,jobject jobj) {
   cout<<"Hello World"<<endl;
}

生成lib文件&#34; hello.so&#34;:

gcc -shared -fpic -o hello.so -I/usr/lib/jvm/jdk1.8.0_45/include -I/usr/lib/jvm/jdk1.8.0_45/include/linux hello.cpp

最后运行文件:

java -Djava.library.path=. Lab

然后我收到错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at Lab.<clinit>(Lab.java:6)

我知道还有其他帖子也有同样的问题,但不幸的是,这些解决方案都不适合我。 我已经尝试过如下的事情:

  • 将hello.so文件复制到&#34; / usr / lib&#34;它位于java lib路径中,并使用chmod;
  • 赋予它权限
  • 使用export aswell;
  • 将hello.so文件路径添加到$ LD_LIBRARY_PATH
  • 运行java文件时添加hello.so路径(java -Djava.library.path =&#34; / root / Desktop&#34; Lab);
  • 使用ldconfig,它甚至不起作用。

我需要在一个主要的应用程序中使用它,但我只是尝试一个快速的例子,即使我在其他帖子上阅读的所有解决方案也无法使其工作。

谢谢。

1 个答案:

答案 0 :(得分:5)

另一天搜索Stack并找到我需要的here。 在Linux上,.so lib文件必须具有前缀“lib”。所以在我的例子中,我的lib文件应该命名为libhello.so而不是hello.so,一切正常。