Android-JNI開發—那些你不知道的事

來源:互聯網
上載者:User
 

一、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為尾碼。

提示:單個目標代碼是無法直接執行的,目標代碼在運行之前需要使用串連程式將目標代碼和其他庫函數串連在一起後產生可執行檔檔案。 Windows下.dll的檔案 , linux下 .so .a的檔案.

標頭檔:

|- 標頭檔中存放的是對某個庫中所定義的函數、宏(define)、類型、全域變數等進行聲明,它類似於一份倉庫清單。若使用者程式中需要使用某個庫中的函數,則只需要將該庫所對應的標頭檔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技術分為兩部分:Java端和C語言端。且以Java端為主導。

|- 首先,Java程式員在Java端定義一些native方法,並將這些方法以C語言標頭檔的方式提供給C程式員。

|- 然後,C程式員使用C語言,來實現Java程式員提供的標頭檔中定義的函數。

|- 接著,C程式員將函數打包成一個庫檔案,並將庫檔案交給Java程式員。

|- 最後,Java程式員在Java程式中匯入庫檔案,然後調用native方法。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.