Java 本身跨平台,但有時需呼叫平台相關的 DLL(Windows 動態連結庫)。主要有三種方案:JNI、Jawin、Jacob。本文比較其架構、使用步驟、優缺點與適用場景。
Java 官方標準,跨平台,可在不同 OS 呼叫對應原生庫。
native 關鍵字宣告方法簽名(無方法體)。javah 產生對應的 C/C++ 標頭檔 .h。jni.h,使用 JNI 定義的資料型別(如 jboolean 對應 boolean)進行參數轉換,並可在其中呼叫既有 DLL。.dll,Linux 為 .so),放入 java.library.path。System.loadLibrary() 載入,即可使用 native 方法。| 優點 | 缺點 |
|---|---|
| 跨平台、官方標準、效能最好 | 需撰寫 C/C++ 封裝碼、開發門檻高、除錯困難 |
SourceForge 開源專案,基於 JNI 封裝,專為 Windows 平台設計,支援 COM 元件與 DLL 呼叫。
採用原始位元組流傳遞參數:在 Java 中組裝參數位元組陣列(需考慮資料型別大小、位元組序),呼叫 FuncPtr.invoke(),再解析回傳的位元組陣列。
Jawin.dll 放專案目錄,Jawin.jar 加入 classpath。FuncPtr ptr = new FuncPtr("DllFileName.dll", "functionName");LittleEndianOutputStream 將參數寫入 NakedByteStream。ptr.invoke(instructionString, paramSize, byteStream, objArray, returnFlags)。IIP16G:I —— 兩個 int 輸入、一個 16 位元組結構體 inout、一個指標輸入,回傳 int。
| 優點 | 缺點 |
|---|---|
| 無需撰寫 C/C++、直接呼叫既有 DLL、上手快 | 僅限 Windows、參數組裝複雜、錯誤皆拋 COMException 難除錯 |
同樣基於 JNI,專注 COM 橋接,也可呼叫 DLL。社群回饋易用度不如 Jawin,文件較少。