【第177期 June 5, 2012】
 

研發新視界

Java呼叫DLL檔之方法解析

作者/莊育明

[發表日期:2012/6/5]


摘要

相較於C#或其他程式語言可直接呼叫DLL檔的便利性,在使用Java這種程式語言時,需要透過其他機制來呼叫DLL檔,譬如JNI (Java Native Interface)、JNA (Java Native Access)以及JNative等。

做法

要讓Java與外部程式溝通,就像是在Java的虛擬機器上打一個洞。底下為使用JNI的一個例子:

一、需先做一個HelloWorld.java


二、進行編譯 (可得HelloWorld.class)


三、產生標頭檔 (HelloWorld.h)


四、實作此.h的.cpp

  • 以visual c++ 6.0為例,須新增Win32 Dynamic-Link Library的project,將專案名稱填為hello,按下ok後選擇An Empty Dll Project,最後按下Finish。

  • 將Java JDK下include資料夾內所有檔案,copy到visual c++ 6.0下的VC98\Include資料夾內。

  • 將第三點產生的HelloWorld.h加入我們的標頭檔,並實作一個.cpp,如下:

  • 選擇工具列的Build hello.dll後,便可在專案目錄下的Debug資料夾內得到hello.dll

五、將hello.dll與HelloWorld.class放在一起後,執行java HelloWorld可得結果。

那如果我們遇上程式要呼叫Third-Party的DLL檔時,該怎麼處理呢? 一樣可以透過JNI的方式處理,但步驟繁雜 (請見JNI , Java如何call C/C++的library);若你/妳遇此情況建議改用JNative。

根據JNative Howto提到,欲使用JNative前,需要先安裝Java JDK、任一個IDE以及JNative相關元件。JNative相關元件主要為JNative.jar、JNative.dll (Linux下需使用libjnative.so)。使用JNative的方式如下:

一、將JNative.jar複製到專案的lib資料夾裡。
二、將JNativeCpp.dll複製到Windows\System32資料夾下 (註)。

  註: 64位元的環境下,DLL要放在windows\SysWOW64 (置於windows\System32下無法正常運作)。

三、直接在你/妳java檔案的適當位置,加入類似下方的程式片段 (Test.dll存放位置與JNativeCpp.dl相同):


故我們只需要知道Third-Party DLL中要呼叫的函數名稱以及相關參數資訊,便可順利地透過JNative呼叫DLL檔。除了JNative,JNA可以是你/妳的另一種選擇,使用上的便利性同樣優於JNI,請參考 Using JNA call dllJNA (1): 在Java程式中直接呼叫Native Code

結論

“方法百百款”,各有巧妙不同。藉由學習、摸索的過程,找到你/妳最習慣的方法吧!

參考資料