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

我有一个Java文件:

class hjni {

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

     private native void print();

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

我使用以下代码来编译和生成头文件:
javac hjni.java
javah -jni hjni

这是C++文件:
 #include <jni.h>
 #include <stdio.h>
 #include "hjni.h"

 JNIEXPORT void JNICALL
 Java_hjni_print(JNIEnv *env, jobject obj)
 {
     printf("Hello World!\n");
     return;
 }

我编译C++文件:
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.classhjni.hhjni.so均已创建。

我运行Java文件:
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

有趣的是,文件夹
/usr/java/packages/lib/amd64

不存在:
cd /usr/java/packages/lib/amd64
bash: cd: /usr/java/packages/lib/amd64: No such file or directory

我可以在这里找到共享库(libjli.so):
/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli

当我通过添加上述路径时
export LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli

只要终端处于打开状态,路径就可以成功添加。如果关闭终端然后重新打开,则添加的路径不再存在。我也将hjni.so复制到jli文件夹,但出现相同的链接错误。

最佳答案

当您执行System.loadLibrary("hjni")时,Java将查找名为libhjni.so的文件。调用System.mapLibraryName(libname)来查找给定库的文件名。不幸的是,用于mapLibraryName的Javadoc仅声明了该名称将被映射到平台相关的名称,而不是构建该文件名的规则。它是Windows的<name>.dll,Linux的lib<name>.so和Mac OS X的lib<name>.jnilib,但是我现在无法找到该引用。

如果您重命名文件,一切都会正常。

10-07 13:00