2011-09-02 60 views
7

我在這裏看到了這個問題,嘗試了所提出的修復方法,但迄今爲止還沒有成功。我有相當一些Java的經驗,但JNI很久以前,從來沒有在Linux上做過...Linux上的JNI問題:無法打開共享對象文件

我試圖得到一個簡單的HelloWorld JNI應用程序運行在Linux上。

小型的Java文件:

class HelloWorld { 

    private native void print(); 

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

    static { 
     System.out.println(System.getProperty("java.library.path")); 
     System.loadLibrary("HelloWorld"); 
    } 

} 

小C文件:

#include <jni.h> 
#include <stdio.h> 
#include "HelloWorld.h" 

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

編制由C文件:

java HelloWorld 

gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so 

通過運行程序

java -Djava.library.path=/home/nxp40954/jnitesting/. HelloWorld 

但沒有好,得到一個:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/nxp40954/jnitesting/libHelloWorld.so: /home/nxp40954/jnitesting/libHelloWorld.so: cannot open shared object file: No such file or directory 

奇怪,因爲實際上有一個/home/nxp40954/jnitesting/libHelloWorld.so文件。

有沒有人有線索?

回答

7

執行這種方式:

export LD_LIBRARY_PATH=. 
java HelloWorld 

的java.lang.UnsatisfiedLinkError中當.so文件無法加載異常。 LD_LIBRARY_PATH變量指向額外的位置以查找* .so文件。

我在使用sun java的32位ubuntu上。我正在編譯這種方式:

gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux -o libHelloWorld.so 
+0

是的,我知道libs應該走LD_LIBRARY_PATH定義的路徑,「。」也在那裏,甚至通過使用-Djava.library.path =/home/nxp40954/jnitesting我明確地定義了libHelloWorld.so的位置,但我仍然得到這個「沒有這樣的文件或目錄」的錯誤。 – Vlemmix

+0

我編譯了你的代碼,它適用於我。你可以嘗試在一個目錄中完成所有操作,並使用「。」。 ?順便說一句,你用什麼java? Waht OS? –

4

你的例子在32位Linux安裝上爲我工作。

將共享庫編譯爲32位或64位共享庫嗎?用命令file libHelloWorld.so檢查。如果您的共享庫是64位的,那麼在啓動Java時需要提供命令行選項-d64,以便Java可以加載64位共享庫。

如果你的共享庫是32位的,那麼Java選項-d32可能會解決這個問題。

+0

謝謝你!應該有這個想法。沒有64位JVM支持,但lib是64位的。添加了-m32參數給gcc,一切都沒有。謝謝! – Vlemmix

+1

如果你不喜歡我,那麼請確保你指定'LD_LIBRARY_PATH'環境變量,而不是Java的java.library.path'。這是因爲如果你的鏈接庫需要訪問另一個鏈接庫,它將無法找到它,因爲它不知道java.library.path。 –

相關問題