簡體   English   中英

在 ubuntu 上使用 JNI 時出錯:java.lang.UnsatisfiedLinkError: no ... in java.library.path

[英]Error when using JNI on ubuntu: java.lang.UnsatisfiedLinkError: no … in java.library.path

我知道關於這個主題有類似的問題,但沒有一個答案可以解決我的問題:

我有一個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 ,但我現在找不到相關的參考。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM