2013-05-14 114 views
1
class HelloWorld { 
    public native void print(); //native method 
    static //static initializer code 
    { 
     try{ 
      String path = System.getProperty("java.library.path"); 
      System.out.println(path); 
     System.loadLibrary("CLibHelloWorld1"); 
     //System.load("C:/TE_CDA_Project/Test/native/CLibHelloWorld1.dll"); 
     //Runtime.getRuntime().load("C:/TE_CDA_Project/Test/native/CLibHelloWorld1.dll"); 

    System.out.println("Loaded CallApi"); 
    }catch(UnsatisfiedLinkError e){ 
     e.printStackTrace(); 
    } 
} 

public static void main(String[] args) 
{ 
    HelloWorld hw = new HelloWorld(); 

    hw.print(); 


} 

}java.lang.UnsatisfiedLinkError中使用JNI

輸出:

C:\TE_CDA_Project\Test\native 
Loaded CallApi 
Exception in thread "main" java.lang.UnsatisfiedLinkError: Graph.HelloWorld.print()V 
    at Graph.HelloWorld.print(Native Method) 
    at Graph.HelloWorld.main(HelloWorld.java:26) 
+0

這是最有可能,因爲的java.library.path路徑變量目前尚未設置。這是Java提取所需庫的路徑。 – 2013-05-14 09:53:07

+0

@Paritosh:我想你應該也發佈你的本地代碼。由於本地方法的簽名錯誤,通常會發生此異常。看到這裏的例子:http://stackoverflow.com/questions/16518490/java-lang-unsatisfiedlinkerror-jni/16519301#16519301(如果你面臨同樣的問題,不要忘記+1這個答案) – Zax 2013-05-15 04:25:30

回答

0

根據這一錯誤

Exception in thread "main" java.lang.UnsatisfiedLinkError: Graph.HelloWorld.print()V 

我可以假設你指定正確的路徑,本地庫,這個問題可能意味着Java不能將本地方法映射到實際本地函數。因此,庫中的本地方法應該存在一些問題,可能您試圖訪問的方法簽名可能是錯誤的。

0

該錯誤是說的是,你試圖調用一個方法是這樣的:

void native print(); 

Graph.HelloWorld聲明,但JVM一直沒能找到該方法的本機代碼實現。

這可能是由兩件事情引起的:

  • 您的應用程序還沒有做出System.loadLibrary(...)加載本地庫。

  • 您加載的本地庫不會聲明與Graph.HelloWorld類中的方法的名稱和簽名相匹配的方法。 (類名可能是錯的,或者方法的名稱,或參數類型或結果類型。)


雖然我有您的關注,Graph.HelloWorld是一個嚴重的Java風格衝突。假設Graph是一個包名,它應該是完全小寫的。此外,建議(除了「扔掉」代碼之外的任何內容)遵循用反向域名加前綴包名的約定......以便您的「圖形」包不會意外與其他人發生衝突。

1

添加到您的C編譯器,它的工作對我來說更多的選擇:

-Wl,--export-all-symbols -Wl,--add-stdcall-alias 
相關問題