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

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

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

我有一个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仅说明名称将映射到依赖于平台的名称,但未说明构建此文件名的规则是什么。这是<name>.dll对于 Windows,lib<name>.so适用于 Linux 和 lib<name>.jnilib适用于 Mac OS X,但我现在找不到相关的引用资料。

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

关于java - 在 ubuntu 上使用 JNI 时出错 : java. lang.UnsatisfiedLinkError : no . .. in java.library.path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36904131/

相关文章:

c++ - 自己写c++ "array"类

java - 设置具有相同的删除,但都不会覆盖另一个错误

c# - 计算机如何在类型之间进行转换

c# - 如何将 C/C++ dll 导入到 .NET 应用程序

java - 如何选择由脚本 selenium webdriver 生成的元素

java - 将谷歌地图( fragment ?)添加到 Activity

c++ - Gtkmm 编译错误

java - 终端显示找不到文件后怎么办?

java - Android:找不到自定义 LinearLayout 的构造函数

java - 我应该使用什么格式化程序模式从数字 '00123' 和 '00001' 相应地获取 '123' 、 '1' 字符串?