2016-02-11 69 views
1

我想运行一个简单的JNI例子,我运行一个java应用程序,通过动态库调用C++函数。Linux,java.lang.UnsatisfiedLinkError:java.library.path中没有“库文件”

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

的.java

public class Lab{ 
    public native void hello(); 

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

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

GET的.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文件头文件 “hello.so”:

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文件复制到“/ usr/lib目录”,这是在Java库路径,并给它使用chmod许可;
  • 使用export aswell将hello.so文件路径添加到$ LD_LIBRARY_PATH;
  • 在运行java文件时添加hello.so路径(java -Djava.library.path =“/ root/Desktop”Lab);
  • 使用ldconfig甚至没有工作。

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

谢谢。

+0

嗨,你有没有试图将.so文件复制到.class文件夹下? – Igor

+0

你好,是以上所有文件都在同一个目录下 – RubenC

回答

2

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

+0

我一直在抨击我的头反对这个同样的问题几个小时 - 谢谢你! – Alex

相关问题