JNI基礎

一、基礎知識

       JNIjava native interface通常被成爲Java本地方法,它是Java虛擬機實現的一部分,因此我們可以在任何的虛擬機上使用JNI。通過JNI我們可以完成和宿主計算機(就是安裝JVM或者JDK的操作系統)以及在此係統上用CC++語言寫的本地程序了!以下是Java虛擬機、JNI以及宿主計算機、本地程序以及java應用程序和類庫的層次關係!

 

 

 

       從上面的圖可以看出:JNIJava虛擬機的一部分,在它之上Sun公司提供了大量的類庫,這些類庫一般分門別類地以包的形式提供,如用於網絡編程的net包、用於圖形界面編程的swing(這是Sun公司提供給廣大程序設計者的金山銀山,在其類庫中包含大量的設計理念、設計方法!毫不誇讚地講、很負責任地講它包含了軟件發展至今的大部分思想!不信!它本身就是一個典型的OOP的典範:在IO中使用了裝飾器模式,在Swing中使用了FlighWeight模式、Composite模式,在Collections Framework中使用Iterator模式、Decorator模式,同時它本身也是一個很優秀的Framework、其對網絡的支持使其也是前所未有的……它是我們學習java最好的教程!且完全免費哦!)Java虛擬機也是一個程序它是用其它語言,如CC++實現的,我們現在研究的JNIJava虛擬機規範的一部分,在研究JNI後我們可以進一步研究Java虛擬機,從而可以研究操作系統之類的東西!java虛擬機是運行在操作系統上的程序而已,通過JNIjava應用程序可以和操作系統交互,例如我們的類庫中的很多實現都是使用JNI,最最經常看到的就是Thread類中的Native方法。同時使用JNI我們可以讓java和用CC++寫的本地程序交互。

二、何時使用JNI

       一般的程序員很少會使用到JNI,甚至85%的人一輩子都不可能使用到JNI,但是在以下情況下,我們一般會使用JNI

1.         將已有的CC++應用程序或現有系統集成到Java應用程序中;

2.         在已有語言CC++集成Java虛擬機;

3.         實現Java虛擬機;

4.         理解語言集成的具體細節,例如如何垃圾回收、如何實現多線程、如何實現SWT中的某些細節……

       不過你想更好地使用java、更好地發揮java的特性,甚至只是爲了增長你的知識,學習別人優秀的地方,你可以選擇學習JNI(學不學是你的事,研究不研究是其它人的事!竟然有此中人喧囂“用不到的,中國人都用不到的”――謝謝你哦!那是你,不是所有的人!你不是別人的上帝!)學習JNI一般比較簡單,這主要是由於JNIJVM實現的一部分,我們只不過是在調用系統提供的函數罷了!假如你喜歡研究、想提高自己的層次、想在此行業有所作爲、請繼續研究吧!下圖是使用JNI的六個步驟。(具體步驟、你可以參照本系列的第一部分)

 

      

 

       使用JNI和本地程序交互包含以下六個步驟:

1.         創建一個java應用程序,其中包含若干個本地方法。本地方法具有以下標識:1.必須包含修飾符native2.沒有方法體,即方法後以“;”結尾。其它類似與java中的其它種方法。包含本地方法的java程序有一個十分鮮明的特點:方法中有一個靜態的語句塊,該語句塊完成加載實現此本地方法的動態鏈接庫(DLL)。正因爲其是靜態語句塊,因此它總是在類被構造前完成。

2.         使用javac編譯剛纔的包含本地方法的java源文件。結果會產生一個同名的類文件。

3.         接着使用javah“編譯”此類文件,產生一個同名的頭文件(主要用於描述類及其中的本地方法,後面有介紹!)

4.         根據前面產生的頭文件,使用CC++語言實現此本地方法。

5.         VCCB等工具編譯、連接你的CC++語言實現。產生一個動態連接庫。

6.         這樣你就可以象使用其它類一樣使用此類了。(注意此時此DLL文件可以和類文件在同一個目錄下,也可以放到系統可以搜索的路徑下,就是環境變量Path下!)否則會報錯哦!不信!你可以試試把上面的hello.dll改名爲hello1.dll就可以看到錯誤了!你可以同時爲解釋器環境設置變量的方法增加路徑,形如:

              java –Djava.library.path=具體路徑加動態鏈接庫的名字

例如:java –Djava.library.path=.hello 表示庫的路徑爲當前目錄下的名爲hellodll文件。

       以上就是使用JNI的基本步驟了!下篇我們將講述JNI中的數據類型和java數據類型的關係!

 

       最後,我還得提示一下,JNI不是一個很常用的方向!80%的程序員級別的可能一輩子都用不到!但是學完了,你可以知道什麼地方需要它!學精了你的工具箱中應該有多了一個法寶!希望大家繼續關注。

 

http://miaoxiaodong78.blog.163.com/blog/static/1876513620061196645538/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章