NO.1 七夕前空猜,我認(rèn)識(shí)了NDK

NDK妹子生活照

看前必讀

  • 讀完本章绽慈,你可以掌握NDK、JNI的概念及其開(kāi)發(fā)流程辈毯。
  • 閱讀時(shí)坝疼,不必糾結(jié)于讀不懂的代碼結(jié)構(gòu),后面的教程 都會(huì)講到的谆沃。

一钝凶、為何要學(xué)習(xí)NDK?

  1. 代碼的保護(hù)唁影。Android APK的Java層代碼很容易被反編譯耕陷,但C/C++庫(kù)反編譯難度較大。
  2. 可以方便地使用現(xiàn)存的開(kāi)源庫(kù)据沈。大部分現(xiàn)存的開(kāi)源庫(kù)都是用C/C++代碼編寫(xiě)的哟沫。
  3. 提高程序的執(zhí)行效率。將要求高性能的應(yīng)用邏輯使用C開(kāi)發(fā)锌介,從而提高應(yīng)用程序的執(zhí)行效率嗜诀。
  4. 便于移植猾警。用C/C++寫(xiě)的庫(kù)可以方便在其他的嵌入式平臺(tái)上再次使用。

二隆敢、先知道什么是JNI

JNI(Java Native Interface)是Java語(yǔ)言提供的Java和C/C++互相溝通的機(jī)制发皿,可以實(shí)現(xiàn):

  1. java調(diào)用本地的C/C++代碼
  2. 本地的C/C++代碼也可以調(diào)用java代碼

三、開(kāi)發(fā)JNI程序的簡(jiǎn)化流程

  1. 編寫(xiě)Java Code拂蝎,如下例子:
    /**
     * 加載lavor本地共享庫(kù)到內(nèi)存中
     */
    static {
        System.loadLibrary("lavor");
    }

    /**
     * 定義本地方法對(duì)應(yīng)的Java方法
     *
     * @return
     */
    public native String getString();
  1. 編寫(xiě)C/C++穴墅,如下例子:
#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_lavor_ndklearning_MainActivity_getString(JNIEnv *env, jobject instance) {

    return (*env)->NewStringUTF(env, "這是我的c程序代碼");
}
  1. 編譯 C/C++ Code,成功并得到本地共享庫(kù)温自。

小知識(shí)

  • 本地共享庫(kù)是Linux下的叫法玄货,文件擴(kuò)展名是.so,windows下叫動(dòng)態(tài)鏈接庫(kù)捣作,文件擴(kuò)展名是.dll誉结。
  • <a name="001" id="001" >C /C++的跨平臺(tái)性是以犧牲編譯時(shí)間以及編譯難度為代價(jià)的。(這里的編譯難度是指為適應(yīng)不同平臺(tái)而做的編譯過(guò)程的調(diào)整)</a>
  • Java的一次編譯到處運(yùn)行券躁,是以犧牲運(yùn)行效率為代價(jià)的惩坑。
  1. 編譯并打包Java。
    把本地共享庫(kù)(.so文件)放置到Java項(xiàng)目的指定目錄也拜,一般是libs文件夾以舒。然后編譯Java代碼即可打包運(yùn)行。

小知識(shí)

  • Android項(xiàng)目中慢哈,.so文件存放地址為libs/armeabi蔓钟。(armeabi是對(duì)應(yīng)的平臺(tái),下一章將會(huì)詳細(xì)介紹)

四卵贱、NDK概述

NDK(Native Development Kit)是Google為Android進(jìn)行本地開(kāi)發(fā)而放出的一個(gè)本地開(kāi)發(fā)工具滥沫, 包括Android的Native API、公共庫(kù)以及編譯工具键俱。其實(shí)說(shuō)白就是Google為方便Android程序猿開(kāi)發(fā)JNI程序兰绣,而提供的便捷工具。

補(bǔ)充兩點(diǎn)

  • NDK處在JNI開(kāi)發(fā)流程中的編譯環(huán)節(jié)(第三编振、四步)缀辩。針對(duì)不同的平臺(tái),NDK可以全自動(dòng)編譯出對(duì)應(yīng)可運(yùn)行的本地共享庫(kù)踪央,并可將對(duì)應(yīng)的.so文件和應(yīng)用程序一起打包成apk發(fā)布臀玄。(這時(shí),跨平臺(tái)編譯C/C++的難度指數(shù)降為0畅蹂。<a href="#001">不明白請(qǐng)猛擊</a>)
  • NDK需要Android 1.5版本以上的支持健无。

五、開(kāi)發(fā)NDK程序的流程

這個(gè)開(kāi)發(fā)流程大致與JNI的開(kāi)發(fā)流程差不多:

  1. SDK開(kāi)發(fā)液斜。編寫(xiě)Java代碼累贤,調(diào)用各種Android的API實(shí)現(xiàn)功能募胃,編寫(xiě)含有native關(guān)鍵字的代碼開(kāi)始JNI。
  2. JNI開(kāi)發(fā)畦浓。按照 JNI編碼規(guī)范,編寫(xiě)與Java交互的本地代碼(一般就是數(shù)據(jù)類型的轉(zhuǎn)換检疫,把 C/C++的數(shù)據(jù)類轉(zhuǎn)換成Java能識(shí)別的讶请,或反過(guò)來(lái))
  3. C/C++開(kāi)發(fā)屎媳。編碼實(shí)現(xiàn)業(yè)務(wù)邏輯夺溢,或調(diào)用NDK提供的本地API或庫(kù),完成Android平臺(tái)上特定功能的開(kāi)發(fā)烛谊、封裝风响。
  4. NDK編譯,編寫(xiě).mk文件丹禀,編譯調(diào)試状勤,最后修改.mk文件,針對(duì)特定的平臺(tái)(ARM/x86)做編譯結(jié)果的優(yōu)化双泪。
  5. 最后就是SDK編譯持搜、打包,上真機(jī)調(diào)試了...

注意啦焙矛!此文并非原創(chuàng)葫盼,算是對(duì)一波優(yōu)秀文章的總結(jié)吧。筆者希望通過(guò)這種方式激勵(lì)自己學(xué)習(xí)村斟,也期待可以幫到正在學(xué)習(xí)NDK的你贫导。歡迎指出本文的BUG,共勉s№铩:⒌啤!H沼А钱反!


參考資料

  1. NDK和SDK以及JNI有什么關(guān)系?
  2. Android之NDK開(kāi)發(fā)
  3. Android NDK官方文檔
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匣距,一起剝皮案震驚了整個(gè)濱河市面哥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毅待,老刑警劉巖尚卫,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尸红,居然都是意外死亡吱涉,警方通過(guò)查閱死者的電腦和手機(jī)刹泄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怎爵,“玉大人特石,你說(shuō)我怎么就攤上這事”盍矗” “怎么了姆蘸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)芙委。 經(jīng)常有香客問(wèn)我逞敷,道長(zhǎng),這世上最難降的妖魔是什么灌侣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任推捐,我火速辦了婚禮,結(jié)果婚禮上侧啼,老公的妹妹穿的比我還像新娘牛柒。我一直安慰自己,他們只是感情好痊乾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布焰络。 她就那樣靜靜地躺著,像睡著了一般符喝。 火紅的嫁衣襯著肌膚如雪闪彼。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天协饲,我揣著相機(jī)與錄音畏腕,去河邊找鬼。 笑死茉稠,一個(gè)胖子當(dāng)著我的面吹牛描馅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播而线,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铭污,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了膀篮?” 一聲冷哼從身側(cè)響起嘹狞,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎誓竿,沒(méi)想到半個(gè)月后磅网,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筷屡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年涧偷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了簸喂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡燎潮,死狀恐怖喻鳄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情确封,我是刑警寧澤诽表,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站隅肥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏袄简。R本人自食惡果不足惜腥放,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绿语。 院中可真熱鬧秃症,春花似錦、人聲如沸吕粹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匹耕。三九已至聚请,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稳其,已是汗流浹背驶赏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留既鞠,地道東北人煤傍。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嘱蛋,于是被迫代替她去往敵國(guó)和親蚯姆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,747評(píng)論 25 707
  • 一洒敏、NDK產(chǎn)生的背景 Android平臺(tái)從誕生起龄恋,就已經(jīng)支持C、C++開(kāi)發(fā)凶伙。眾所周知篙挽,Android的SDK基于J...
    Ten_Minutes閱讀 3,485評(píng)論 1 27
  • Android游戲開(kāi)發(fā)實(shí)踐(1)之NDK與JNI開(kāi)發(fā)02 承接上篇Android游戲開(kāi)發(fā)實(shí)踐(1)之NDK與JNI...
    AlphaGL閱讀 3,744評(píng)論 0 24
  • 今天老師把剩下的數(shù)據(jù)庫(kù)講完了,也就是所有的課程都結(jié)束了镊靴。還領(lǐng)著我們鞏固了之前學(xué)的知識(shí)铣卡。 下午助教老師把圖書(shū)管理系統(tǒng)...
    34d71ddb735c閱讀 166評(píng)論 0 0
  • 但知行好事煮落,莫要問(wèn)前程敞峭。——馮道《天道》 今天在簡(jiǎn)書(shū)上看到一篇文章關(guān)于寫(xiě)作道路上遇到的一些困惑蝉仇。曾經(jīng)在自己生活中也...
    123涅槃閱讀 797評(píng)論 5 2