Android JNI之執(zhí)杖生涯 .a -> .so(mk方式)(android studio)

緣由

曾夢(mèng)想仗劍走天涯艇纺,看一看世界的繁華糖耸。豈料一入 JNI 深似海其监,從此女神是路人剔桨。生成so文件,是每個(gè) JNI 人的終極夢(mèng)想幔翰。前段日子漩氨,公司人少,扔過(guò)來(lái)的是cpp實(shí)現(xiàn)文件遗增,呵呵,以為要往c渣渣方向發(fā)展款青,嚇得我趕緊拿起那本紅皮書(shū)做修,c++從入門(mén)到放棄。幾個(gè)月過(guò)去,書(shū)還沒(méi)人捧熱饰及,cpp不見(jiàn)了蔗坯,取而代之是.a文件,什么玩意兒燎含?掏出度娘宾濒,怒刷binggo。一手Shadowsocks屏箍,谷狗汪汪汪绘梦。靜態(tài)庫(kù),簡(jiǎn)單來(lái)說(shuō)赴魁,編譯器認(rèn)識(shí)卸奉,而linux不認(rèn)識(shí)。故事颖御,從這里開(kāi)始榄棵。

.a 怎么用

想用就用,用得響亮潘拱。我就靜靜的疹鳄,靜靜的看著。一巴掌一個(gè)腳印芦岂,啪啪啪瘪弓,痛嗎?不痛盔腔,輕輕松松三步走杠茬。

啪. 定位

下藥要對(duì)口,位置不能隨心弛随。來(lái)來(lái)來(lái)瓢喉,jni (JNI Floder)目錄下。又回到最初的起點(diǎn)舀透,記憶中你cpp文件的位置(打個(gè)廣告栓票,參考我前邊寫(xiě)的關(guān)于JNI文章)。對(duì)愕够,沒(méi)錯(cuò)走贪,又是jni目錄。進(jìn)階的.a惑芭,還是老地方坠狡,熟悉的味道,不一樣的配方遂跟。然逃沿,no pic no bb婴渡。吶~*@……#!#凯亮!神圣召喚術(shù) --- 圖圖圖边臼。


JNI目錄圖

上邊的sources目錄是瞎寫(xiě)的,歸個(gè)類假消。這里有東西解釋下柠并,比如說(shuō) arm64-v8a之類的, 這個(gè)是指cpu類型富拗。目前而言臼予,armeabi 這個(gè)是基類,所有手機(jī)都支持的類型媒峡。蕓蕓眾手機(jī)瘟栖,天涯cpu類型what?no谅阿,no半哟,nobody I want nobody nobody But You,一個(gè)字:懶签餐。so armeabi寓涨,你值得擁有。x86/x86-64這個(gè)一般是電腦cpu類型氯檐,模擬器用得上戒良。如果能夠每個(gè)類型都build出來(lái),自然是好的冠摄,畢竟每個(gè)類型cpu都有各自的優(yōu)化糯崎。

啪啪. 鏈接

重點(diǎn)來(lái)了。使用.a的過(guò)程河泳,就是鏈接沃呢。當(dāng)然不僅僅是,整個(gè)打包成so過(guò)程拆挥,都是鏈接過(guò)程薄霜,這里主講如何鏈接.a。
mk纸兔,從 jni 誕生那一刻起惰瓜,隨之誕生。這里暫且先講mk方式實(shí)現(xiàn)鏈接汉矿,其它暫且不提崎坊。悠久的歷史,腳本性質(zhì)的配置洲拇,承載著老一輩人的遠(yuǎn)方與詩(shī)流强。左手痹届,右手呻待,一個(gè)慢動(dòng)作打月。一步兩步三四步,帶你走個(gè)過(guò)場(chǎng)蚕捉。記住了奏篙,固然可喜,若是沒(méi)有迫淹,就再看一遍吧秘通。


mk版結(jié)構(gòu)圖
# Android.mk文件,稍作修改敛熬,即可食用
LOCAL_PATH := $(call my-dir)

//鏈接.a塊
include $(CLEAR_VARS)
LOCAL_MODULE := libHello
LOCAL_C_INCLUDES := $(LOCAL_PATH)/sources
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/sources
LOCAL_SRC_FILES := sources/$(TARGET_ARCH_ABI)/libHello.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_CPPFLAGS  := -std=c++14
LDFLAGS := -shared
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_MODULE           := JniDemo
LOCAL_SRC_FILES        :=   jni_dynamic.cpp
LOCAL_STATIC_LIBRARIES := libHello
include $(BUILD_SHARED_LIBRARY)
# Application.mk 這個(gè)基本不需要改
APP_STL := gnustl_static//使用 STL 靜態(tài)庫(kù)
NDK_TOOLCHAIN_VERSION := 4.9//鏈接器tool版本
/**
 *fexceptions 允許異常功能
 *frtti 運(yùn)行時(shí)類型識(shí)別
 *fpermissive 此項(xiàng)有效時(shí)表示寬松的編譯形式肺稀,比如沒(méi)有用到的代碼中有錯(cuò)誤也可以通過(guò)
 * std=c++14 允許使用c++14的函數(shù)等功能
 */
APP_CPPFLAGS := -fexceptions -frtti -fpermissive -std=c++14
APP_ABI := armeabi armeabi-v7a arm64-v8a mips mips64
APP_PLATFORM := android-14
APP_OPTIM := debug

這2個(gè)固定搭配,沒(méi)什么需要特別解釋的地方应民,照搬磚頭即可话原。如果你砸到了自己的腳,火速120诲锹,你來(lái)找我也沒(méi)用繁仁。mk文件已經(jīng)就位,當(dāng)然還需要build.gradle的支持归园。

android{
    ....
    task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
        commandLine "E:/adt-bundle-windows-x86_64-20140321/android-ndk-r10/ndk-build.cmd",//ndk.build位置
                'NDK_PROJECT_PATH=build/intermediates/ndk',//ndk位置
                'NDK_LIBS_OUT=src/main/jniLibs',//輸出目錄
                'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
                'NDK_APPLICATION_MK=src/main/jni/Application.mk'
    }
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
}

這段黄虱,不解釋呢,說(shuō)不過(guò)去庸诱。解釋呢捻浦,一句話,自定義ndkbuild命令(生成so的利器)桥爽。到這里本想著已經(jīng)告一段路了朱灿,是時(shí)候見(jiàn)證奇跡的時(shí)刻了。然而還不料聚谁,一個(gè)error讓我沉醉母剥,毫無(wú)保留,沒(méi)有余力悲傷:

D:\Study_Code\JniDemo\app\src\main\jni\sources\hello.h
Error:(1, 18) string: No such file or directory
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: Error while executing 'E:\adt-bundle-windows-x86_64-20140321\android-ndk-r10\ndk-build.cmd' with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=D:\Study_Code\JniDemo\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-25 NDK_OUT=D:\Study_Code\JniDemo\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=D:\Study_Code\JniDemo\app\build\intermediates\ndk\debug\lib APP_ABI=all}

顯然形导,c++中string找不到环疼。喲喲喲,切克鬧朵耕。bug炫隶,bug,bug阎曹,驚起一灘苦水伪阶。既然開(kāi)啟了自定義煞檩,那么就需要做點(diǎn)限制,比如說(shuō)禁用自動(dòng)執(zhí)行ndk-build栅贴。如果自動(dòng)執(zhí)行ndk-build的話斟湃,那么我的Application.mk配置將失效,默認(rèn)是c環(huán)境檐薯,緣來(lái)如此凝赛。

android{
    ...
    sourceSets {
        main {
            jni.srcDirs = []//禁用自動(dòng)執(zhí)行ndk-build 
        }
    }
}

.mk 這艘小船,到這兒坛缕,已經(jīng)上岸了墓猎。

啪啪啪.見(jiàn)證奇跡的時(shí)刻

上邊的已然做到,那么這一刻赚楚,屬于你的奇跡終究還是到來(lái)了毙沾。biu,biu宠页,build左胞。接下來(lái),或許更精彩勇皇。
附送一張機(jī)票罩句,帶你領(lǐng)略世界的浩瀚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敛摘,隨后出現(xiàn)的幾起案子门烂,更是在濱河造成了極大的恐慌,老刑警劉巖兄淫,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屯远,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捕虽,警方通過(guò)查閱死者的電腦和手機(jī)慨丐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泄私,“玉大人房揭,你說(shuō)我怎么就攤上這事∩味耍” “怎么了捅暴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)咧纠。 經(jīng)常有香客問(wèn)我蓬痒,道長(zhǎng),這世上最難降的妖魔是什么漆羔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任梧奢,我火速辦了婚禮狱掂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亲轨。我一直安慰自己趋惨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布瓶埋。 她就那樣靜靜地躺著希柿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪养筒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天端姚,我揣著相機(jī)與錄音晕粪,去河邊找鬼。 笑死渐裸,一個(gè)胖子當(dāng)著我的面吹牛巫湘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昏鹃,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尚氛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了洞渤?” 一聲冷哼從身側(cè)響起阅嘶,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎载迄,沒(méi)想到半個(gè)月后讯柔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡护昧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年魂迄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惋耙。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捣炬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绽榛,到底是詐尸還是另有隱情湿酸,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布蒜田,位于F島的核電站稿械,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冲粤。R本人自食惡果不足惜美莫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一页眯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厢呵,春花似錦窝撵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至寒砖,卻和暖如春赐劣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哩都。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工魁兼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漠嵌。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓咐汞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親儒鹿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子化撕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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