一、基礎知識
JNI-java native interface通常被成爲Java本地方法,它是Java虛擬機實現的一部分,因此我們可以在任何的虛擬機上使用JNI。通過JNI我們可以完成和宿主計算機(就是安裝JVM或者JDK的操作系統)以及在此係統上用C或C++語言寫的本地程序了!以下是Java虛擬機、JNI以及宿主計算機、本地程序以及java應用程序和類庫的層次關係!
從上面的圖可以看出:JNI是Java虛擬機的一部分,在它之上Sun公司提供了大量的類庫,這些類庫一般分門別類地以包的形式提供,如用於網絡編程的net包、用於圖形界面編程的swing包…(這是Sun公司提供給廣大程序設計者的金山銀山,在其類庫中包含大量的設計理念、設計方法!毫不誇讚地講、很負責任地講它包含了軟件發展至今的大部分思想!不信!它本身就是一個典型的OOP的典範:在IO中使用了裝飾器模式,在Swing中使用了FlighWeight模式、Composite模式,在Collections Framework中使用Iterator模式、Decorator模式,同時它本身也是一個很優秀的Framework、其對網絡的支持使其也是前所未有的……它是我們學習java最好的教程!且完全免費哦!)Java虛擬機也是一個程序它是用其它語言,如C、C++實現的,我們現在研究的JNI是Java虛擬機規範的一部分,在研究JNI後我們可以進一步研究Java虛擬機,從而可以研究操作系統之類的東西!java虛擬機是運行在操作系統上的程序而已,通過JNI是java應用程序可以和操作系統交互,例如我們的類庫中的很多實現都是使用JNI,最最經常看到的就是Thread類中的Native方法。同時使用JNI我們可以讓java和用C或C++寫的本地程序交互。
二、何時使用JNI
一般的程序員很少會使用到JNI,甚至85%的人一輩子都不可能使用到JNI,但是在以下情況下,我們一般會使用JNI。
1. 將已有的C、C++應用程序或現有系統集成到Java應用程序中;
2. 在已有語言C、C++集成Java虛擬機;
3. 實現Java虛擬機;
4. 理解語言集成的具體細節,例如如何垃圾回收、如何實現多線程、如何實現SWT中的某些細節……
不過你想更好地使用java、更好地發揮java的特性,甚至只是爲了增長你的知識,學習別人優秀的地方,你可以選擇學習JNI。(學不學是你的事,研究不研究是其它人的事!竟然有此中人喧囂“用不到的,中國人都用不到的”――謝謝你哦!那是你,不是所有的人!你不是別人的上帝!)學習JNI一般比較簡單,這主要是由於JNI是JVM實現的一部分,我們只不過是在調用系統提供的函數罷了!假如你喜歡研究、想提高自己的層次、想在此行業有所作爲、請繼續研究吧!下圖是使用JNI的六個步驟。(具體步驟、你可以參照本系列的第一部分)
使用JNI和本地程序交互包含以下六個步驟:
1. 創建一個java應用程序,其中包含若干個本地方法。本地方法具有以下標識:1.必須包含修飾符native;2.沒有方法體,即方法後以“;”結尾。其它類似與java中的其它種方法。包含本地方法的java程序有一個十分鮮明的特點:方法中有一個靜態的語句塊,該語句塊完成加載實現此本地方法的動態鏈接庫(DLL)。正因爲其是靜態語句塊,因此它總是在類被構造前完成。
2. 使用javac編譯剛纔的包含本地方法的java源文件。結果會產生一個同名的類文件。
3. 接着使用javah“編譯”此類文件,產生一個同名的頭文件(主要用於描述類及其中的本地方法,後面有介紹!)
4. 根據前面產生的頭文件,使用C或C++語言實現此本地方法。
5. 用VC、CB等工具編譯、連接你的C或C++語言實現。產生一個動態連接庫。
6. 這樣你就可以象使用其它類一樣使用此類了。(注意此時此DLL文件可以和類文件在同一個目錄下,也可以放到系統可以搜索的路徑下,就是環境變量Path下!)否則會報錯哦!不信!你可以試試把上面的hello.dll改名爲hello1.dll就可以看到錯誤了!你可以同時爲解釋器環境設置變量的方法增加路徑,形如:
java –Djava.library.path=具體路徑加動態鏈接庫的名字
例如:java –Djava.library.path=.hello 表示庫的路徑爲當前目錄下的名爲hello的dll文件。
以上就是使用JNI的基本步驟了!下篇我們將講述JNI中的數據類型和java數據類型的關係!
最後,我還得提示一下,JNI不是一個很常用的方向!80%的程序員級別的可能一輩子都用不到!但是學完了,你可以知道什麼地方需要它!學精了你的工具箱中應該有多了一個法寶!希望大家繼續關注。
http://miaoxiaodong78.blog.163.com/blog/static/1876513620061196645538/