【NDK Lab】環(huán)境搭建以及so打包和使用

直入正題凌受!

環(huán)境搭建

開(kāi)發(fā)環(huán)境

  • MacBook Pro(macOS Sierra10.12.6)
  • Android Studio2.3.3
  • Gradle 2.3.3

NDK install

1、這里我是采用Android Studio自行安裝的,打開(kāi)AndroidStudio,選擇頂部工具條,Tools->Android->SDK Manager->SDK Tools->NDK 點(diǎn)擊install

NDK安裝路徑
設(shè)置NDK路徑

2、也可以自行下載ndk包(去AndroidDevTools或者谷歌官方網(wǎng)站下載),下載ndk包后解析到某個(gè)路徑新翎,打開(kāi)Project Structure->設(shè)置 NDK location程帕,同上1設(shè)置NDK路徑

3、NDK環(huán)境變量配置地啰,我們需要使用到ndk-build命令愁拭,打開(kāi)終端 -> 輸入 :vim ~/.bash_profile -> 加入NDK 包的路徑,具體怎么使用vim進(jìn)行編輯請(qǐng)自行百度

配置NDK環(huán)境變量
配置NDK環(huán)境變量

4亏吝、保存文件岭埠,關(guān)閉.bash_profile,輸入source .bash_profile或者重新開(kāi)啟一個(gè)terminal 蔚鸥,當(dāng)前配置才會(huì)生效惜论。 命令行輸入ndk-build驗(yàn)證配置是否成功

總之:整個(gè)配置過(guò)程同Android SDK的配置一樣

NDK開(kāi)發(fā)實(shí)戰(zhàn)

1、創(chuàng)建Android項(xiàng)目JniLab
2止喷、查看項(xiàng)目local.properties中加入ndk和sdk的路徑是否正確

ndk.dir=/Users/didi/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/didi/Library/Android/sdk

3馆类、配置項(xiàng)目下的gradle.properties文件,表示我們要使用NDK進(jìn)行開(kāi)發(fā)(缺少這步會(huì)導(dǎo)致后續(xù)無(wú)法通過(guò)alt+enter快捷鍵生成jni文件夾)

android.useDeprecatedNdk=true

4弹谁、在moudle根目錄下的的build.gradle中的defaultConfig標(biāo)簽內(nèi)部里加入如下代碼

ndk{    
 // 生成的so文件名字乾巧,調(diào)用C程序的代碼中會(huì)用到該名字,需要保持一致    
moduleName "algorithm"     
// 輸出指定三種平臺(tái)下的so庫(kù)
// 還可以添加 'x86_64', 'mips', 'mips64'
abiFilters "armeabi", "armeabi-v7a", "x86" 
}

5、編寫(xiě)jni代碼
通過(guò)System.loadLibrary加載的庫(kù)名要和上述4的moduleName一致预愤,否則會(huì)出現(xiàn)java.lang.UnsatisfiedLinkError問(wèn)題沟于,找不到so庫(kù)

JniManager

6、執(zhí)行第5步的時(shí)候植康,如上圖所示旷太,對(duì)應(yīng)native方法(getInfo)會(huì)提示找不到對(duì)應(yīng)方法,快捷鍵 alt+enter 會(huì)生成對(duì)應(yīng)jni文件夾销睁,包含algorithm.c文件供璧,此處的native方法還是會(huì)顯示紅色,但是不影響編譯

jni文件夾生成

7榄攀、編譯項(xiàng)目后會(huì)發(fā)現(xiàn)app/build中已經(jīng)生成so文件嗜傅,并且已經(jīng)對(duì)應(yīng)的cpu包就是我們?cè)趃radle中已經(jīng)配置的,并且已經(jīng)調(diào)用成功

build中生成對(duì)應(yīng)so文件

PS:編譯時(shí)可能碰到NDK_PROJECT_PATH = null問(wèn)題

Messages Gradle Build

暫時(shí)的解決方法:將app module的compileSdkVersion與targetSdkVersion由之前的25改成24(可能也跟最新的NDK版本有關(guān)系)

成功調(diào)用native方法

打包出動(dòng)態(tài)so文件,在其它項(xiàng)目中使用

有時(shí)候我們的需求是這樣的檩赢,我們把一些比較重要的業(yè)務(wù)邏輯封裝到ndk內(nèi)部,對(duì)java層只暴露接口违寞。我們就需要打包出so文件贞瞒,并且可能需要在其他項(xiàng)目中使用,下面將介紹so(符合JNI標(biāo)準(zhǔn))文件的打包趁曼,以及在其他項(xiàng)目中如何正確的調(diào)用

  • 編寫(xiě)Android.mk文件军浆,放到j(luò)ni文件夾根目錄,與.c文件同級(jí)
    PS:注意中文注釋或者中文空格帶來(lái)的意外麻煩
LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
LOCAL_MODULE := algorithm
LOCAL_SRC_FILES := /Users/sus/example/JniLab/app/src/main/jni/algorithm.c
 include $(BUILD_SHARED_LIBRARY)
  • 使用ndk-build命令(需要配置NDK環(huán)境變量挡闰,參照上文NDK環(huán)境變量配置)乒融,生成so文件
  • 編寫(xiě)Application.mk文件掰盘,放到j(luò)ni文件夾根目錄,與.c文件同級(jí)
APP_PLATFORM := android-14
APP_ABI :=all //打包出所有cpu平臺(tái)so文件

進(jìn)入到main目錄后在terminal中輸入命令赞季,ndk-build工具便會(huì)幫我們打包出所有cpu平臺(tái)so文件

ndk-build
libs目錄

其它項(xiàng)目使用該so文件

  • 拷貝so文件到項(xiàng)目的main/jniLibs目錄
  • 新建package愧捕,包名與類(lèi)名以及方法名必須與生成so文件的類(lèi)保持一致!
  • 使用loadLibrary加載動(dòng)態(tài)庫(kù)申钩,聲明native方法

PS:這里如果你不想新建項(xiàng)目測(cè)試次绘,你可以在main下新建jniLibs文件夾,把libs里的so放到j(luò)niLibs中撒遣,刪除libs文件夾邮偎,然后刪除jni文件夾運(yùn)行也會(huì)起到類(lèi)似在新項(xiàng)目中使用so文件的作用

  • 對(duì)于上面說(shuō)的【包名與類(lèi)名以及方法名必須與生成so文件的類(lèi)保持一致!】這個(gè)規(guī)范义黎,讀者可能有疑惑禾进,這樣的約束太死板不夠靈活,我們?cè)谑褂靡恍┌瑂o庫(kù)的第三方SDK的時(shí)候并不記得有這么多限制
  • 的確如此廉涕,我們看下第三方SDK是怎么搞的泻云,以Umeng Push SDK為參考來(lái)看一下,我們發(fā)現(xiàn)第三方庫(kù)都會(huì)帶有jar包火的,然后通過(guò)包里面去調(diào)用so文件壶愤,我們只需要使用jar包中暴露的接口方法即可,而上述的規(guī)范可能更適合內(nèi)部人員之間開(kāi)發(fā)和使用so
Umeng Push SDK

下載地址:JniLab

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馏鹤,一起剝皮案震驚了整個(gè)濱河市征椒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湃累,老刑警劉巖勃救,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異治力,居然都是意外死亡蒙秒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)宵统,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晕讲,“玉大人,你說(shuō)我怎么就攤上這事马澈∑笆。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵痊班,是天一觀的道長(zhǎng)勤婚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涤伐,這世上最難降的妖魔是什么馒胆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任缨称,我火速辦了婚禮,結(jié)果婚禮上祝迂,老公的妹妹穿的比我還像新娘睦尽。我一直安慰自己,他們只是感情好液兽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布骂删。 她就那樣靜靜地躺著,像睡著了一般四啰。 火紅的嫁衣襯著肌膚如雪宁玫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天柑晒,我揣著相機(jī)與錄音欧瘪,去河邊找鬼。 笑死匙赞,一個(gè)胖子當(dāng)著我的面吹牛佛掖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涌庭,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芥被,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坐榆?” 一聲冷哼從身側(cè)響起拴魄,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎席镀,沒(méi)想到半個(gè)月后匹中,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豪诲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年顶捷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屎篱。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡服赎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出交播,到底是詐尸還是另有隱情专肪,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布堪侯,位于F島的核電站,受9級(jí)特大地震影響荔仁,放射性物質(zhì)發(fā)生泄漏伍宦。R本人自食惡果不足惜芽死,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望次洼。 院中可真熱鬧关贵,春花似錦、人聲如沸卖毁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亥啦。三九已至炭剪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翔脱,已是汗流浹背奴拦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留届吁,地道東北人错妖。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像疚沐,于是被迫代替她去往敵國(guó)和親暂氯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 一亮蛔、NDK產(chǎn)生的背景 Android平臺(tái)從誕生起痴施,就已經(jīng)支持C、C++開(kāi)發(fā)尔邓。眾所周知晾剖,Android的SDK基于J...
    Ten_Minutes閱讀 3,507評(píng)論 1 27
  • 這段時(shí)間講課內(nèi)容是圓周角。 圓周角定理及推論梯嗽。 始終強(qiáng)調(diào)是弧所對(duì)的圓周角和圓心角齿尽,在做題講題也特殊的指出一下,感覺(jué)...
    我愛(ài)炎熱的夏季閱讀 494評(píng)論 0 1
  • 據(jù)俄羅斯媒體10日?qǐng)?bào)道灯节,俄羅斯電子支付系統(tǒng)的一份研究報(bào)告稱(chēng)循头,2015年夏季俄羅斯居民在中國(guó)網(wǎng)店上通過(guò)該支付系統(tǒng)進(jìn)行...
    XRU俄速遞閱讀 328評(píng)論 0 1
  • ____祐閱讀 147評(píng)論 0 0