2012-07-07 98 views
2

我已閱讀了許多類似的問題,但仍然對此項目感到困惑。我正在嘗試在Ubuntu 11.04 64位上使用Eclipse的非常簡單的JNI項目。無法在JNI項目中加載.so

我已經正確構建了我的.so文件。我知道這一點,因爲我可以在我的Java程序中使用System.load(「/ exact/path/to/my/libcproject.so」)時調用它。但是當我嘗試使用System.loadLibrary(「libcproject」)時,我得到一個不滿意的鏈接錯誤。

這裏是我的簡單的Java程序:

package pkg; 
public class MyClass { 
static { 
    System.out.println("java.library.path: " + System.getProperty("java.library.path")); 
    System.loadLibrary("libcproject"); 
} 
private native String foo(String input); 
public static void main(String[] args) { 
    MyClass mc = new MyClass(); 
    String output = mc.foo("input"); 
    System.out.println(output); 
} 
} 

正如你所看到的,我打印的java.library.path是什麼。當我運行該程序,我得到:

java.library.path: /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64/server:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/../lib/amd64:/home/mlevin/workspace/cproject/Debug:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 
input 

「輸入」是我的C函數返回(它只是給你回你給它)。

如果我將System.load調用更改爲System.loadLibrary(「libcproject」),即使如您所見,從輸出可以看到/ home/mlevin/workspace/cproject/Debug,但仍會收到不滿意的鏈接錯誤,這是libcproject.so所在的位置,位於java.library.path中。

java.library.path: /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64/server:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/../lib/amd64:/home/mlevin/workspace/cproject/Debug:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libcproject in java.library.path 
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738) 
at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
at java.lang.System.loadLibrary(System.java:1028) 
at pkg.MyClass.<clinit>(MyClass.java:7) 
Could not find the main class: pkg.MyClass. Program will exit. 

我對此非常困惑。有什麼建議麼?

感謝

回答

4

刪除該lib前綴,像這樣:

System.loadLibrary("cproject"); 

的Java自動添加lib開始和.so末(類Unix操作系統,反正在Windows上,增加了.dll到最後)。

+0

先生,您是天才!我整天都在抨擊這件事。謝謝! – mlevin 2012-07-07 21:46:45

0

.export LD_LIBRARY_PATH =。,因此設置當前目錄的庫路徑,Java文件找到這樣的。