首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 呼叫 DLL 三大方案比較:JNI、Jawin、Jacob 優缺點分析

     編輯:Java 相關知識

前言

Java 本身跨平台,但有時需呼叫平台相關的 DLL(Windows 動態連結庫)。主要有三種方案:JNI、Jawin、Jacob。本文比較其架構、使用步驟、優缺點與適用場景。

一、JNI (Java Native Interface)

Java 官方標準,跨平台,可在不同 OS 呼叫對應原生庫。

使用步驟

  1. 撰寫 Java 類別,以 native 關鍵字宣告方法簽名(無方法體)。
  2. 用 javah 產生對應的 C/C++ 標頭檔 .h。
  3. 撰寫 C/C++ 程式碼實作標頭檔中的函式,包含 jni.h,使用 JNI 定義的資料型別(如 jboolean 對應 boolean)進行參數轉換,並可在其中呼叫既有 DLL。
  4. 編譯為共享庫(Windows 為 .dll,Linux 為 .so),放入 java.library.path。
  5. Java 程式中呼叫 System.loadLibrary() 載入,即可使用 native 方法。

優缺點

優點缺點
跨平台、官方標準、效能最好需撰寫 C/C++ 封裝碼、開發門檻高、除錯困難

二、Jawin (Java Win32)

SourceForge 開源專案,基於 JNI 封裝,專為 Windows 平台設計,支援 COM 元件與 DLL 呼叫。

核心機制

採用原始位元組流傳遞參數:在 Java 中組裝參數位元組陣列(需考慮資料型別大小、位元組序),呼叫 FuncPtr.invoke(),再解析回傳的位元組陣列。

使用步驟

  1. 下載 Jawin,將 Jawin.dll 放專案目錄,Jawin.jar 加入 classpath。
  2. FuncPtr ptr = new FuncPtr("DllFileName.dll", "functionName");
  3. 用 LittleEndianOutputStream 將參數寫入 NakedByteStream。
  4. 呼叫 ptr.invoke(instructionString, paramSize, byteStream, objArray, returnFlags)。
  5. 解析回傳位元組陣列取得結果。

指令字串範例

IIP16G:I —— 兩個 int 輸入、一個 16 位元組結構體 inout、一個指標輸入,回傳 int。

優缺點

優點缺點
無需撰寫 C/C++、直接呼叫既有 DLL、上手快僅限 Windows、參數組裝複雜、錯誤皆拋 COMException 難除錯

三、Jacob (Java COM Bridge)

同樣基於 JNI,專注 COM 橋接,也可呼叫 DLL。社群回饋易用度不如 Jawin,文件較少。

總結建議

  • 需跨平台、追求極致效能、團隊具 C/C++ 能力 → 選 JNI。
  • 僅限 Windows、需快速整合既有 DLL/COM、不想碰 C/C++ → 選 Jawin。
  • 主要整合 COM 元件、且團隊熟悉 Jacob → 可評估 Jacob。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved