Android JNI NDK開發(fā)教程:JNI NDK概述《一》

簡(jiǎn)介

最近項(xiàng)目中經(jīng)常使用到JNI,在這里記錄總結(jié)一下。

JNI是什么达罗?

????????JNI(Java Native Interface)譯為JAVA本地接口調(diào)用,它允許Java代碼和其他語(yǔ)言(主要是C與C++)寫的代碼進(jìn)行交互静秆,簡(jiǎn)單的說(shuō)粮揉,一種在Java虛擬機(jī)控制下執(zhí)行代碼的標(biāo)準(zhǔn)機(jī)制。

NDK是什么抚笔?

????????Android NDK(Android Native Development Kit )是一套android本地開發(fā)工具集合扶认,允許你用像C與C++語(yǔ)言那樣實(shí)現(xiàn)應(yīng)用程序的一部分。

為什么要使用NDK開發(fā)殊橙?

????????1辐宾、安全性,java是半解釋型語(yǔ)言膨蛮,很容易被反匯編后拿到源代碼文件叠纹,我們可以在重要的交互功能使用C或C++語(yǔ)言代替。

????????2敞葛、效率吊洼,C或C++語(yǔ)言比起java來(lái)說(shuō)效率要高出很多。

JNI和NDK的區(qū)別制肮?

????????從工具上說(shuō)冒窍,NDK其實(shí)多了一個(gè)把.so和.apk打包的工具,而JNI開發(fā)并沒有打包豺鼻,只是把.so文件放到文件系統(tǒng)的特定位置上面综液。

????????從編譯庫(kù)說(shuō),NDK開發(fā)C或C++只能能使用NDK自帶的有限的頭文件儒飒,而使用JNI則可以使用文件系統(tǒng)中帶的頭文件谬莹。

????????從編寫方式說(shuō),它們一樣。

JNI 相關(guān)元素

1附帽、JNI組織結(jié)構(gòu)

????????JNI函數(shù)表的組成就像C++的虛函數(shù)表埠戳,虛擬機(jī)可以運(yùn)行多張函數(shù)表。JNI接口指針僅在當(dāng)前線程中起作用蕉扮,指針不能從一個(gè)線程進(jìn)入另一個(gè)線程整胃,但可以在不同的線程中調(diào)用本地方法。

2喳钟、原始數(shù)據(jù)


3屁使、Java類型和JNI類型對(duì)應(yīng)表


Java類型和JNI類型對(duì)應(yīng)表

4、JNI域描述符


引用類型則為 L + 該類型類描述符 + 奔则。

數(shù)組蛮寂,其為 : [ + 其類型的域描述符 + 。

多維數(shù)組則是 n個(gè)[ +該類型的域描述符 , N代表的是幾維數(shù)組易茬。

String類型的域描述符為 Ljava/lang/String;[ + 其類型的域描述符 + ;int[ ] 其描述符為[Ifloat[ ] 其描述符為[FString[ ] 其描述符為[Ljava/lang/String;Object[ ]類型的域描述符為[Ljava/lang/Object;int [ ][ ] 其描述符為[[Ifloat[ ][ ] 其描述符為[[F

將參數(shù)類型的域描述符按照申明順序放入一對(duì)括號(hào)中后跟返回值類型的域描述符酬蹋,規(guī)則如下: (參數(shù)的域描述符的疊加)返回類型描述符。對(duì)于抽莱,沒有返回值的范抓,用V(表示void型)表示。

舉例如下:

Java層方法 JNI函數(shù)簽名String test ( ) Ljava/lang/String;int f (int i, Object object) (ILjava/lang/Object;)Ivoid set (byte[ ] bytes) ([B)V

JNIEnv與JavaVM 概念

1岸蜗、JNIEnv 概念 : 是一個(gè)線程相關(guān)的結(jié)構(gòu)體, 該結(jié)構(gòu)體代表了 Java 在本線程的運(yùn)行環(huán)境 ;

2尉咕、JNIEnv 與 JavaVM :

?????注意區(qū)分這兩個(gè)概念;

(1)JavaVM : JavaVM 是 Java虛擬機(jī)在 JNI 層的代表, JNI 全局只有一個(gè);

(2)JNIEnv : JavaVM 在線程中的代表, 每個(gè)線程都有一個(gè), JNI 中可能有很多個(gè) JNIEnv;

3叠蝇、JNIEnv 作用 :

(1)調(diào)用 Java 函數(shù) : JNIEnv 代表 Java 運(yùn)行環(huán)境, 可以使用 JNIEnv 調(diào)用 Java 中的代碼;

(2)操作 Java 對(duì)象 : Java 對(duì)象傳入 JNI 層就是 Jobject 對(duì)象, 需要使用 JNIEnv 來(lái)操作這個(gè) Java 對(duì)象;

4璃岳、JNIEnv 體系結(jié)構(gòu)

線程相關(guān) : JNIEnv 是線程相關(guān)的, 即 在 每個(gè)線程中 都有一個(gè) JNIEnv 指針, 每個(gè)JNIEnv 都是線程專有的, 其它線程不能使用本線程中的 JNIEnv, 線程 A 不能調(diào)用 線程 B 的 JNIEnv;

5、JNIEnv 不能跨線程 :

(1) 當(dāng)前線程有效 : JNIEnv 只在當(dāng)前線程有效, JNIEnv 不能在 線程之間進(jìn)行傳遞, 在同一個(gè)線程中, 多次調(diào)用 JNI層方法, 傳入的 JNIEnv 是相同的;

(2) 本地方法匹配多JNIEnv : 在 Java 層定義的本地方法, 可以在不同的線程調(diào)用, 因此 可以接受不同的 JNIEnv;

JNIEnv 結(jié)構(gòu) : 由上面的代碼可以得出, JNIEnv 是一個(gè)指針, 指向一個(gè)線程相關(guān)的結(jié)構(gòu), 線程相關(guān)結(jié)構(gòu)指向 JNI 函數(shù)指針 數(shù)組, 這個(gè)數(shù)組中存放了大量的 JNI 函數(shù)指針, 這些指針指向了具體的 JNI 函數(shù);

注意:JNIEnv只在當(dāng)前線程中有效悔捶。本地方法不能將JNIEnv從一個(gè)線程傳遞到另一個(gè)線程中铃慷。相同的 Java 線程中對(duì)本地方法多次調(diào)用時(shí),傳遞給該本地方法的JNIEnv是相同的蜕该。但是犁柜,一個(gè)本地方法可被不同的 Java 線程所調(diào)用,因此可以接受不同的 JNIEnv堂淡。

更多經(jīng)驗(yàn)持續(xù)更新...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馋缅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绢淀,更是在濱河造成了極大的恐慌萤悴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皆的,死亡現(xiàn)場(chǎng)離奇詭異覆履,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門硝全,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栖雾,“玉大人,你說(shuō)我怎么就攤上這事伟众∥雠海” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵赂鲤,是天一觀的道長(zhǎng)噪径。 經(jīng)常有香客問我,道長(zhǎng)数初,這世上最難降的妖魔是什么找爱? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮泡孩,結(jié)果婚禮上车摄,老公的妹妹穿的比我還像新娘。我一直安慰自己仑鸥,他們只是感情好吮播,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眼俊,像睡著了一般意狠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疮胖,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天环戈,我揣著相機(jī)與錄音,去河邊找鬼澎灸。 笑死院塞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的性昭。 我是一名探鬼主播拦止,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糜颠!你這毒婦竟也來(lái)了汹族?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤其兴,失蹤者是張志新(化名)和其女友劉穎顶瞒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忌警,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搁拙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年秒梳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箕速。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酪碘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盐茎,到底是詐尸還是另有隱情兴垦,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布字柠,位于F島的核電站探越,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窑业。R本人自食惡果不足惜钦幔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望常柄。 院中可真熱鬧鲤氢,春花似錦、人聲如沸西潘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喷市。三九已至相种,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間品姓,已是汗流浹背寝并。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缭黔,地道東北人食茎。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓蒂破,卻偏偏與公主長(zhǎng)得像馏谨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子附迷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容