由於Java是一個跨平台的語言,因此許多與平台(作業系統)相依的功能,在Java語言中支援的並不多,此時如果你所負責的專案又一定要用到這些平台相依的功能(例如,讀寫實體記體體、IO Port),這時就只好請現場來賓幫忙,或是call out 求助於朋友。
Java設計者當然也很貼心地幫我們考量到這一點,提供了JNI(Java Native Interface)這個機制,讓Java程式可以三不五時的和外面的朋友串串門子。這些「外國朋友」為了不讓狗仔隊認出來,因此將自己偽裝成動態函式庫(Windows裡面的.dll檔或是Linux裡面的.lib檔)。由於這些外國朋友和Java講的語言不同,無法直接溝通,為了避免雞同鴨講,白忙一場,因此如果要透過JNI呼叫這些「外國朋友」(native code),還需要找一個翻譯(wrapper),讓Java透過這個wrapper來呼叫外國朋友。
看到這裡,你應該已經「ㄇㄨˇ煞煞」了。是滴,Teddy雖然寫了10多年的Java程式,但對於JNI的認識卻也只停留在紙上談兵的階段。像JNI這種麻煩的事,就交給年輕人去嘗試。Teddy今天要介紹一個「大易輸入法版本」的JNI,叫做JNA(Java Native Access)。透過JNA,就可以直接在Java裡面宣告你想要和哪些外國朋友溝通,然後直接呼叫他們。這種作法,很像在VB裡面呼叫Win32 API,或是在C#裡面呼叫dll。蝦米,這兩種都沒用過…沒關係,繼續看下去。
未滿十八歲的觀眾請注意,以下節目將在Eclipse環境中演出,若遇到看不懂而Teddy又懶的解釋的內容,請自動轉台。
(1) 建立一個新的Java專案,就叫它JNATest。
(2) 到JNA網站(https://jna.dev.java.net/)把 jna.jar抓下來,
(3) 在JNATest專案中,建立一個lib目錄,然後把剛剛抓下來的jna.jar輕輕放到這個目錄中。
(4) 在專案上按下滑鼠右鍵,選Properties,出現如下的畫面。點選左方的Java Build Path,再點選中間的Libraries,再按下右邊的Add JARs…按鈕,此時出現JAR Selection畫面(下下圖),把剛剛放到lib的jna.jar檔案加入。完成後畫面如下所示。
(5) 新增一個JnaMain class。
(6) 把下面程式打到 JnaMain中。
(7) 執行JnaMain,看到下面輸出結果。這樣你就可以在Java裡面呼叫C的printf函數了,黑皮!
報告完畢….
Teddy,給我「休蛋一A」,都沒解釋就演完啦?死豬!大家一定常常看到很多電影,也不都是沒什麼交代就結束了。說實話,程式的內容一半是從JNA網站上的範例山寨過來的,另一半則是從http://www.cplusplus.com/reference/clibrary/cstdio/printf/ 海盜過來的,所以這個例子就像是許多OO大師寫的文章一樣,懂得人不用看就知道,不懂的人看了還是不懂。Orz… 該睡了,吃水果先,好心的Teddy改天再解釋。
l
沒有留言:
張貼留言