java native interface
一概念:
jni是JAVA標準平臺中的一個重要功能,在java實現跨平臺的同時,也能與其它(如c c++)的動態庫進行交互.
二: 實現步驟.
1:編寫帶有native方法的java類: ?iphone.java
2:編譯這個java類: javac iphone.java
3:用javah生成與native方法對應的頭文件: ?javah -jni iphone
4:使用c或者c++語言實現頭文件方法.
5:生成動態庫: gcc -Wl,--kill-at -shared? hello.c -o hello.DLL
6:在程序中加載庫文件,即可使用工具類中的方法.
三:開發中一些錯誤處理:
錯誤1:?java.lang.UnsatisfiedLinkError: no XXX in java.library.path
即“找不到XXX在庫路徑下”,則需要將生成的DLL拷至系統可檢測的PATH路徑中。可檢測PATH路徑可由以下Java語句獲得:
String str = System.getProperty("java.library.path");
System.out.println(str);
解決辦法:你可以把dll庫文件放到打印出來的目錄下,? 或者自己在環境變量 PATH 中添加一個目錄,然后把dll庫拷貝到這個目錄,推薦后者做法,這樣方便對自己編寫的dll庫進行管理.
錯誤2:java.lang.UnsatisfiedLinkError:?
已經加載dll庫文件成功,但是連接函數的時候出錯,可能原因是dll庫中函數名或參數和頭文件不一致,導致找不到該函數的實現,我自己遇到的是編譯時候沒有正確使用編譯選項,導致編譯出來的函數多了@符號
在編譯c c++程序時編譯使用不正確會導致編譯出來的函數多一個@符號,遇到不名錯誤時可以使用DLLExportViewer工具查看dll庫中的函數名或者參數是否與頭文件的聲明的一致.
這里附上mingw官網推薦的編譯方法: