Android中JNI的理解與使用-創(chuàng)新互聯(lián)

基礎(chǔ)知識

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

我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、閔行ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的閔行網(wǎng)站制作公司

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

問:為什么要進(jìn)行交互?

|- 首先,Java語言提供的類庫無法滿足要求,且在數(shù)學(xué)運(yùn)算,實(shí)時(shí)渲染的游戲上,音視頻處理等方面上與C/C++相比效率稍低。

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

|-  接著,使用Java調(diào)用本地的C/C++代碼所寫的庫,省去了重復(fù)開發(fā)的麻煩,并且可以利用很多開源的庫提高程序效率。

C語言常見術(shù)語:

庫函數(shù):printf     scanf      malloc free

|- 為了代碼重用,在C語言中提供了一些常用的、用于執(zhí)行一些標(biāo)準(zhǔn)任務(wù)(如輸入/出)的函數(shù),這些函數(shù)事先被編譯,并生成目標(biāo)代碼,然后將生成的目標(biāo)代碼打包成一個(gè)庫文件,以供再次使用。庫文件中的函數(shù)被稱為庫函數(shù),庫文件被稱為函數(shù)庫。

|- 在Windows中C語言庫函數(shù)中的中間代碼都是以.obj為后綴的,Linux中是以 .o為后綴。

提示:單個(gè)目標(biāo)代碼是無法直接執(zhí)行的,目標(biāo)代碼在運(yùn)行之前需要使用連接程序?qū)⒛繕?biāo)代碼和其他庫函數(shù)連接在一起后生成可執(zhí)行的文件。 Windows下.dll的文件 , linux下 .so .a的文件.

頭文件:xxx.h

|- 頭文件中存放的是對某個(gè)庫中所定義的函數(shù)、宏、類型、全局變量等進(jìn)行聲明,它類似于一份倉庫清單。若用戶程序中需要使用某個(gè)庫中的函數(shù),則只需要將該庫所對應(yīng)的頭文件include到程序中即可。

  |- 頭文件中定義的是庫中所有函數(shù)的函數(shù)原型。而函數(shù)的具體實(shí)現(xiàn)則是在庫文件中。

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

|-  在鏈接器連接程序時(shí),會(huì)依據(jù)用戶程序中導(dǎo)入的頭文件,將對應(yīng)的庫函數(shù)導(dǎo)入到程序中。頭文件以.h為后綴名。

函數(shù)庫:

|-  動(dòng)態(tài)庫:在編譯用戶程序時(shí)不會(huì)將用戶程序內(nèi)使用的庫函數(shù)連接到用戶程序的目標(biāo)代碼中,只有在運(yùn)行時(shí),且用戶程序執(zhí)行到相關(guān)函數(shù)時(shí)才會(huì)調(diào)用該函數(shù)庫里的相應(yīng)函數(shù),因此動(dòng)態(tài)函數(shù)庫所產(chǎn)生的可執(zhí)行文件比較小。

|-  靜態(tài)庫:在編譯用戶程序時(shí)會(huì)將其內(nèi)使用的庫函數(shù)連接到目標(biāo)代碼中,程序運(yùn)行時(shí)不再需要靜態(tài)庫。使用靜態(tài)庫生成可執(zhí)行文件比較大。

在Linux中:

|-  靜態(tài)庫命名一般為:lib+庫名+.a 。

|- 如:libcxy.a 其中l(wèi)ib說明此文件是一個(gè)庫文件,cxy是庫的名稱,.a說明是靜態(tài)的。

|-  動(dòng)態(tài)庫命名一般為:lib+庫名+.so 。.so說明是動(dòng)態(tài)的。

交叉編譯:

|- 將中間代碼連接成當(dāng)前計(jì)算機(jī)可執(zhí)行的二進(jìn)制程序時(shí),連接程序會(huì)根據(jù)當(dāng)前計(jì)算機(jī)的CPU、操作系統(tǒng)的類型來轉(zhuǎn)換。

根據(jù)運(yùn)行的設(shè)備的不同,可以將cpu分為:

|- arm結(jié)構(gòu) :主要在移動(dòng)手持、嵌入式設(shè)備上。

|- x86結(jié)構(gòu) : 主要在臺(tái)式機(jī)、筆記本上使用。如Intel和AMD的CPU 。

若想在使用了基于x86結(jié)構(gòu)CPU的操作系統(tǒng)中編譯出可以在基于arm結(jié)構(gòu)CPU的操作系統(tǒng)上運(yùn)行的代碼,就必須使用交叉編譯。

交叉編譯:在一個(gè)平臺(tái)下編譯出在另一個(gè)平臺(tái)中可以執(zhí)行的二進(jìn)制代碼。Google提供的NDK就可以完成交叉編譯的工作。

NDK全稱:Native Development Kit 。

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

  |-  首先,NDK可以幫助開發(fā)者快速開發(fā)C(或C++)的動(dòng)態(tài)庫。

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

NDK工具必須在Linux下運(yùn)行,它可以在linux環(huán)境下編譯出可以在arm平臺(tái)下運(yùn)行的二進(jìn)制庫文件。

使用JNI技術(shù),其實(shí)就是在Java程序中,調(diào)用C語言的函數(shù)庫中提供的函數(shù),來完成一些Java語言無法完成的任務(wù)。由于Java語言和C語言結(jié)構(gòu)完全不相同,因此若想讓它們二者交互,則需要制定一系列的規(guī)范。JNI就是這組規(guī)范,此時(shí)   Java只和JNI交互,而由JNI去和C語言交互。

JNI技術(shù)分為兩部分:Java端和C語言端。且以Java端為主導(dǎo)。

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

|-  然后,C程序員使用C語言,來實(shí)現(xiàn)Java程序員提供的頭文件中定義的函數(shù)。

|-  接著,C程序員將函數(shù)打包成一個(gè)庫文件,并將庫文件交給Java程序員。

|- 最后,Java程序員在Java程序中導(dǎo)入庫文件,然后調(diào)用native方法。

在Java程序執(zhí)行的時(shí)候,若在某個(gè)類中調(diào)用了native方法,則虛擬機(jī)會(huì)通過JNI來轉(zhuǎn)調(diào)用庫文件中的C語言代碼。提示:C代碼最終是在Linux進(jìn)程中執(zhí)行的,而不是在虛擬機(jī)中。

問題:在Android中可執(zhí)行的文件,在Linux中一定可以執(zhí)行嗎?

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

名稱欄目:Android中JNI的理解與使用-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://muchs.cn/article26/dieccg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站Google、外貿(mào)建站搜索引擎優(yōu)化動(dòng)態(tài)網(wǎng)站、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)