JNI(Java Native Interface,JAVA原生接口)
我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、閔行ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的閔行網(wǎng)站制作公司使用JNI可以使Java代碼和其他語(yǔ)言寫的代碼(如C/C++代碼)進(jìn)行交互。
問(wèn):為什么要進(jìn)行交互?
|- 首先,Java語(yǔ)言提供的類庫(kù)無(wú)法滿足要求,且在數(shù)學(xué)運(yùn)算,實(shí)時(shí)渲染的游戲上,音視頻處理等方面上與C/C++相比效率稍低。
|- 然后,Java語(yǔ)言無(wú)法直接操作硬件,C/C++代碼不僅能操作硬件而且還能發(fā)揮硬件最佳性能。
|- 接著,使用Java調(diào)用本地的C/C++代碼所寫的庫(kù),省去了重復(fù)開(kāi)發(fā)的麻煩,并且可以利用很多開(kāi)源的庫(kù)提高程序效率。
C語(yǔ)言常見(jiàn)術(shù)語(yǔ):
庫(kù)函數(shù):printf scanf malloc free
|- 為了代碼重用,在C語(yǔ)言中提供了一些常用的、用于執(zhí)行一些標(biāo)準(zhǔn)任務(wù)(如輸入/出)的函數(shù),這些函數(shù)事先被編譯,并生成目標(biāo)代碼,然后將生成的目標(biāo)代碼打包成一個(gè)庫(kù)文件,以供再次使用。庫(kù)文件中的函數(shù)被稱為庫(kù)函數(shù),庫(kù)文件被稱為函數(shù)庫(kù)。
|- 在Windows中C語(yǔ)言庫(kù)函數(shù)中的中間代碼都是以.obj為后綴的,Linux中是以 .o為后綴。
提示:?jiǎn)蝹€(gè)目標(biāo)代碼是無(wú)法直接執(zhí)行的,目標(biāo)代碼在運(yùn)行之前需要使用連接程序?qū)⒛繕?biāo)代碼和其他庫(kù)函數(shù)連接在一起后生成可執(zhí)行的文件。 Windows下.dll的文件 , linux下 .so .a的文件.
頭文件:xxx.h
|- 頭文件中存放的是對(duì)某個(gè)庫(kù)中所定義的函數(shù)、宏、類型、全局變量等進(jìn)行聲明,它類似于一份倉(cāng)庫(kù)清單。若用戶程序中需要使用某個(gè)庫(kù)中的函數(shù),則只需要將該庫(kù)所對(duì)應(yīng)的頭文件include到程序中即可。
|- 頭文件中定義的是庫(kù)中所有函數(shù)的函數(shù)原型。而函數(shù)的具體實(shí)現(xiàn)則是在庫(kù)文件中。
|- 簡(jiǎn)單的說(shuō):頭文件是給編譯器用的,庫(kù)文件是給連接器用的。
|- 在鏈接器連接程序時(shí),會(huì)依據(jù)用戶程序中導(dǎo)入的頭文件,將對(duì)應(yīng)的庫(kù)函數(shù)導(dǎo)入到程序中。頭文件以.h為后綴名。
函數(shù)庫(kù):
|- 動(dòng)態(tài)庫(kù):在編譯用戶程序時(shí)不會(huì)將用戶程序內(nèi)使用的庫(kù)函數(shù)連接到用戶程序的目標(biāo)代碼中,只有在運(yùn)行時(shí),且用戶程序執(zhí)行到相關(guān)函數(shù)時(shí)才會(huì)調(diào)用該函數(shù)庫(kù)里的相應(yīng)函數(shù),因此動(dòng)態(tài)函數(shù)庫(kù)所產(chǎn)生的可執(zhí)行文件比較小。
|- 靜態(tài)庫(kù):在編譯用戶程序時(shí)會(huì)將其內(nèi)使用的庫(kù)函數(shù)連接到目標(biāo)代碼中,程序運(yùn)行時(shí)不再需要靜態(tài)庫(kù)。使用靜態(tài)庫(kù)生成可執(zhí)行文件比較大。
在Linux中:
|- 靜態(tài)庫(kù)命名一般為:lib+庫(kù)名+.a 。
|- 如:libcxy.a 其中l(wèi)ib說(shuō)明此文件是一個(gè)庫(kù)文件,cxy是庫(kù)的名稱,.a說(shuō)明是靜態(tài)的。
|- 動(dòng)態(tài)庫(kù)命名一般為:lib+庫(kù)名+.so 。.so說(shuō)明是動(dòng)態(tài)的。
交叉編譯:
|- 將中間代碼連接成當(dāng)前計(jì)算機(jī)可執(zhí)行的二進(jìn)制程序時(shí),連接程序會(huì)根據(jù)當(dāng)前計(jì)算機(jī)的CPU、操作系統(tǒng)的類型來(lái)轉(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可以幫助開(kāi)發(fā)者快速開(kāi)發(fā)C(或C++)的動(dòng)態(tài)庫(kù)。
|- 其次,NDK集成了交叉編譯器。使用NDK,我們可以將要求高性能的應(yīng)用邏輯使用C開(kāi)發(fā),從而提高應(yīng)用程序的執(zhí)行效率。
NDK工具必須在Linux下運(yùn)行,它可以在linux環(huán)境下編譯出可以在arm平臺(tái)下運(yùn)行的二進(jìn)制庫(kù)文件。
使用JNI技術(shù),其實(shí)就是在Java程序中,調(diào)用C語(yǔ)言的函數(shù)庫(kù)中提供的函數(shù),來(lái)完成一些Java語(yǔ)言無(wú)法完成的任務(wù)。由于Java語(yǔ)言和C語(yǔ)言結(jié)構(gòu)完全不相同,因此若想讓它們二者交互,則需要制定一系列的規(guī)范。JNI就是這組規(guī)范,此時(shí) Java只和JNI交互,而由JNI去和C語(yǔ)言交互。
JNI技術(shù)分為兩部分:Java端和C語(yǔ)言端。且以Java端為主導(dǎo)。
|- 首先,Java程序員在Java端定義一些native方法,并將這些方法以C語(yǔ)言頭文件的方式提供給C程序員。
|- 然后,C程序員使用C語(yǔ)言,來(lái)實(shí)現(xiàn)Java程序員提供的頭文件中定義的函數(shù)。
|- 接著,C程序員將函數(shù)打包成一個(gè)庫(kù)文件,并將庫(kù)文件交給Java程序員。
|- 最后,Java程序員在Java程序中導(dǎo)入庫(kù)文件,然后調(diào)用native方法。
在Java程序執(zhí)行的時(shí)候,若在某個(gè)類中調(diào)用了native方法,則虛擬機(jī)會(huì)通過(guò)JNI來(lái)轉(zhuǎn)調(diào)用庫(kù)文件中的C語(yǔ)言代碼。提示:C代碼最終是在Linux進(jìn)程中執(zhí)行的,而不是在虛擬機(jī)中。
問(wèn)題:在Android中可執(zhí)行的文件,在Linux中一定可以執(zhí)行嗎?
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
名稱欄目:Android中JNI的理解與使用-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://jinyejixie.com/article26/dieccg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、Google、外貿(mào)建站、搜索引擎優(yōu)化、動(dòng)態(tài)網(wǎng)站、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容