在ubuntu上使用JNI时出错:java.lang.UnsatisfiedLinkError:no ...在java.library.path中

时间:2016-04-28 02:20:20

标签: java c++ compiler-errors linker java-native-interface

我知道在这个主题上有类似的问题,但没有一个答案可以解决我的问题:

我有一个java文件:

ClusterItem

我使用以下命令编译和生成头文件:

ClusterItem

这是C ++文件:

class hjni {

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

     private native void print();

     public static void main(String[] args) {
         new hjni().print();
     }
 }

我编译C ++文件:

javac hjni.java
javah -jni hjni

文件 #include <jni.h> #include <stdio.h> #include "hjni.h" JNIEXPORT void JNICALL Java_hjni_print(JNIEnv *env, jobject obj) { printf("Hello World!\n"); return; } g++ -fPIC -shared -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux hjni.cpp -o hjni.so hjni.class都已创建。

我运行java文件:

hjni.h

这是我得到的错误:

hjni.so

我使用java -Djava.library.path=. hjni 来检查Exception in thread "main" java.lang.UnsatisfiedLinkError: no hjni in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1889) at java.lang.Runtime.loadLibrary0(Runtime.java:849) at java.lang.System.loadLibrary(System.java:1088) at hjni.<clinit>(hjni.java:4)

java -XshowSettings:properties

有趣的是,文件夹

java.library.path

不存在:

java.library.path = /usr/java/packages/lib/amd64
        /usr/lib/x86_64-linux-gnu/jni
        /lib/x86_64-linux-gnu
        /usr/lib/x86_64-linux-gnu
        /usr/lib/jni
        /lib
        /usr/lib

我可以在这里找到一个共享库(libjli.so):

/usr/java/packages/lib/amd64

当我通过

添加上述路径时
cd /usr/java/packages/lib/amd64
bash: cd: /usr/java/packages/lib/amd64: No such file or directory

只要终端打开,路径就会成功添加。如果我关闭终端并重新打开它,则添加的路径不再存在。我还将/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli 复制到export LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli 文件夹,但我收到了相同的链接错误。

1 个答案:

答案 0 :(得分:1)

执行System.loadLibrary("hjni")时,Java会查找名为libhjni.so的文件。调用System.mapLibraryName(libname)以找出给定库的文件名应该是什么。不幸的是,mapLibraryName的Javadoc只声明该名称将映射到平台相关名称,而不是构建此文件名的规则。它适用于Windows的<name>.dll,适用于Linux的lib<name>.so和适用于Mac OS X的lib<name>.jnilib,但我现在无法找到相应的参考。

如果您重命名文件,一切都会有效。