JNI基礎

11.1基礎知識

JNI(Java Native Interface,JAVA原生接口)

使用JNI可以使Java代碼和其他語言寫的代碼(如C/C++代碼)進行交互。

 

問:爲什麼要進行交互?

|-  首先,Java語言提供的類庫無法滿足要求,且在數學運算,實時渲染的遊戲上,音視頻處理等方面上C/C++相比效率稍低

|-  然後,Java語言無法直接操作硬件,C/C++代碼不僅能操作硬件而且還能發揮硬件最佳性能

|-  接着,使用Java調用本地的C/C++代碼所寫的庫,省去了重複開發的麻煩,並且可以利用很多開源的庫提高程序效率

 

C語言常見術語:

庫函數:

|-  爲了代碼重用,在C語言中提供了一些常用的用於執行一些標準任務(如輸入/)的函數,這些函數事先被編譯,並生成目標代碼,然後將生成的目標代碼打包成一個庫文件以供再次使用庫文件中的函數被稱爲庫函數庫文件被稱爲函數庫

|-  在Windows中C語言庫函數中的目標代碼都是以.obj爲後綴的,Linux中是以 .o爲後綴。

提示:單個目標代碼是無法直接執行的,目標代碼在運行之前需要使用連接程序將目標代碼和其他庫函數連接在一起後生成可執行的文件。

 

頭文件:

|-  頭文件中存放的是對某個庫中所定義的函數類型全局變量等進行聲明,它類似於一份倉庫清單。若用戶程序中需要使用某個庫中的函數,則只需要將該庫所對應的頭文件include到程序中即可。

   |-  頭文件中定義的是庫中所有函數函數原型。而函數的具體實現則是在庫文件中。

   |-  簡單的說:頭文件是給編譯器用的,庫文件是給連接器用的。

|-  在連接器連接程序時,會依據用戶程序中導入的頭文件,將對應的庫函數導入到程序中。頭文件以.h爲後綴名。

 

函數庫:

|-  動態庫:在編譯用戶程序時不會將用戶程序內使用的庫函數連接到用戶程序的目標代碼中,只有在運行時,且用戶程序執行到相關函數時纔會調用該函數庫裏的相應函數,因此動態函數庫所產生的可執行文件比較小

|-  靜態庫:在編譯用戶程序時會將其內使用的庫函數連接到目標代碼中,程序運行時不再需要靜態庫使用靜態庫生成可執行文件比較大

 

在Linux中:

|-  靜態庫命名一般爲:lib+庫名+.a

|-  如:libcxy.a 其中lib說明此文件是一個庫文件cxy庫的名稱.a說明是靜態的

|-  動態庫命名一般爲:lib+庫名+.so 。.so說明是動態的

 

交叉編譯:

|-  將目標代碼連接成當前計算機可執行的二進制程序時,連接程序會根據當前計算機的CPU操作系統類型來轉換。

根據運行的設備的不同,可以將cpu分爲:

|-  arm結構 :主要在移動手持嵌入式設備上

|-  x86結構 : 主要在臺式機筆記本上使用。如Intel和AMD的CPU 。

若想在使用了基於x86結構CPU的操作系統中編譯出可以在基於arm結構CPU的操作系統上運行的代碼,就必須使用交叉編譯

交叉編譯:一個平臺下編譯出在另一個平臺中可以執行的二進制代碼。Google提出的NDK就可以完成交叉編譯的工作。

 

NDK全稱:Native Development Kit 。

|-  NDK是一系列工具的集合它有很多作用

   |-  首先,NDK可以幫助開發者快速開發C(或C++)的動態庫

   |-  其次,NDK集成了交叉編譯器。使用NDK,我們可以將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率

NDK工具必須在Linux下運行,它可以在linux環境下編譯出可以在arm平臺下運行的二進制庫文件。

 

 

使用JNI技術,其實就是在Java程序中,調用C語言函數庫中提供的函數,來完成一些Java語言無法完成的任務。由於Java語言和C語言結構完全不相同,因此若想讓它們二者交互,則需要制定一系列的規範。JNI就是這組規範,此時       Java只和JNI交互,而由JNI去和C語言交互。

 

JNI技術分爲兩部分:JavaC語言端。且Java端爲主導

|-  首先,Java程序員在Java端定義一些vative方法,並將這些方法C語言頭文件的方式提供給C程序員

|-  然後,C程序員使用C語言,來實現Java程序員提供的頭文件中定義的函數

|-  接着,C程序員將函數打包成一個庫文件,並將庫文件交給Java程序員

|-  最後,Java程序員Java程序中導入庫文件,然後調用native方法。

 

在Java程序執行的時候,若在某個類中調用了native方法,則虛擬機會通過JNI來轉調用庫文件中的C語言代碼。提示:C代碼最終是在Linux進程中執行的,而不是在虛擬機中

 

問題:在Android中可執行的文件,在Linux中一定可以執行嗎? arm處理的linux

那爲什麼要說,NDK會交叉編譯。

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