解決NDK日志輸出文件路徑過長問題

在ndk或者jni開發(fā)過程中您旁,我們經(jīng)常會(huì)有打日志的需求烙常,并且需要顯示日志輸出的源文件名稱、行數(shù)等信息鹤盒,這時(shí)候就需要我們輸出一個(gè)完整的日志格式蚕脏。本文針對(duì)采用ndk-build方式編譯,如果是采用cmake編譯昨悼,不再本文討論范圍之內(nèi)

常見宏

首先我們看一下ANSI C標(biāo)準(zhǔn)中幾個(gè)標(biāo)準(zhǔn)預(yù)定義宏:

  • __LINE__:在源代碼中插入當(dāng)前源代碼行號(hào)蝗锥;
  • __FILE__:在源文件中插入當(dāng)前源文件名;
  • __DATE__:在源文件中插入當(dāng)前的編譯日期率触;
  • __TIME__:在源文件中插入當(dāng)前編譯時(shí)間终议;
  • __STDC__:當(dāng)要求程序嚴(yán)格遵循ANSI C標(biāo)準(zhǔn)時(shí)該標(biāo)識(shí)被賦值為1;
    假設(shè)你的日志輸出格式:
#define NEW_LINE "\r\n"
#define G_STRLOC    __FILE__ ":" G_STRINGIFY (__LINE__)
#define DEBUG(fmt, ...) {                                 
        debug_to_file(G_STRLOC " " fmt NEW_LINE, ## __VA_ARGS__); 
}

我們可以看到葱蝗,這里定義的了一個(gè)宏__FILE__這個(gè)就是當(dāng)前源文件

舉個(gè)栗子

正如上面例子所示穴张,使用了__FILE__之后,默認(rèn)情況下两曼,輸出的路徑是編譯該源文件時(shí)皂甘,該源文件在編譯環(huán)境下的全路徑,例如你的源文件路徑是在/User/eggsy/Demo/src/main/jni/test.c悼凑,在該文件的58行中有代碼

58 DEBUG("ouput demo log %s","success");

那么輸出的時(shí)候日志就是

/User/eggsy/Demo/src/main/jni/test.c:58 ouput demo log success

這里我們看到輸出的就是在源文件的全路徑偿枕,當(dāng)前路徑看起來過長了璧瞬,如果你的工程目錄層級(jí)在系統(tǒng)更深處,那么這里前面打印出來的日志路徑就非常長了渐夸,其實(shí)對(duì)我們最重要的是從jni目錄開始日志路徑嗤锉,能夠完整說明源文件路徑

解決方案

傳統(tǒng)方式

先來說下傳統(tǒng)的編譯方式,采用ndk-build方式墓塌,我們經(jīng)常需要在如下目錄下放置Android.mkApplication.mk文件

目錄結(jié)構(gòu)

build.gradle中我們需要配置指定Android.mk文件位置

    // 引入工程外部的編譯文件
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }

這種方式編譯出來的瘟忱,日志中源文件路徑就是全路徑。

優(yōu)化方式

優(yōu)化方式就是我們需要切到src/main/jni目錄下苫幢,

cd src/main/jni

執(zhí)行ndk-build命令

ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk NDK_LIBS_OUT=../output/libs
  • NDK_PROJECT_PATH:指定工程的路徑访诱,由于我們已經(jīng)cd到了jni目錄,這里就用.表示當(dāng)前路徑
  • NDK_APPLICATION_MK:表示application的配置
  • APP_BUILD_SCRIPT:表示構(gòu)建腳本的路徑
  • NDK_LIBS_OUT:表示最后生成動(dòng)靜態(tài)的位置

所以我們看到如上圖目錄結(jié)構(gòu)中的ouput目錄下會(huì)生成我們編譯的庫韩肝。
最后生成日志的時(shí)候触菜,就是相對(duì)路徑啦,沒有前面一大堆絕對(duì)路徑I√荨C登狻!

LOCAL_SRC_FILES源碼路徑

最后距離成功還差一步谜诫,漾峡,參考上面的《目錄結(jié)構(gòu)》圖片,在Android.mk中喻旷,在引用源文件的時(shí)候生逸,要用相對(duì)路徑,如果使用絕對(duì)路徑(LOCAL_PATH變量+源文件)且预,上面的修改就無效了槽袄,例如

LOCAL_SRC_FILES := $(LOCAL_PATH)/andsrc/demo.c ......

需要改為

LOCAL_SRC_FILES := andsrc/demo.c ......

這樣的相對(duì)路徑,相對(duì)路徑是相對(duì)于Android.mk的當(dāng)前路徑而言锋谐。

總結(jié)

其實(shí)這個(gè)小技巧很簡單遍尺,但是真正遇到的時(shí)候可能會(huì)困擾一些同學(xué)很久,最關(guān)鍵的就是編譯的時(shí)候需要指定NDK_PROJECT_PATH涮拗、NDK_APPLICATION_MK乾戏、APP_BUILD_SCRIPT參數(shù)啦,當(dāng)然這些參數(shù)你也可以配置在gradle中三热,無需手動(dòng)執(zhí)行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鼓择,一起剝皮案震驚了整個(gè)濱河市贼急,隨后出現(xiàn)的幾起案子薛训,更是在濱河造成了極大的恐慌,老刑警劉巖尚揣,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抑堡,死亡現(xiàn)場離奇詭異摆出,居然都是意外死亡朗徊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門懊蒸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荣倾,“玉大人,你說我怎么就攤上這事骑丸。” “怎么了妒貌?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵通危,是天一觀的道長。 經(jīng)常有香客問我灌曙,道長菊碟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任在刺,我火速辦了婚禮逆害,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚣驼。我一直安慰自己魄幕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布颖杏。 她就那樣靜靜地躺著纯陨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪留储。 梳的紋絲不亂的頭發(fā)上翼抠,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音获讳,去河邊找鬼阴颖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丐膝,可吹牛的內(nèi)容都是我干的量愧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼尤误,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼侠畔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起损晤,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤软棺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尤勋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喘落,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茵宪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘦棋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稀火。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赌朋,靈堂內(nèi)的尸體忽然破棺而出凰狞,到底是詐尸還是另有隱情,我是刑警寧澤沛慢,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布赡若,位于F島的核電站,受9級(jí)特大地震影響团甲,放射性物質(zhì)發(fā)生泄漏逾冬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一躺苦、第九天 我趴在偏房一處隱蔽的房頂上張望身腻。 院中可真熱鬧,春花似錦匹厘、人聲如沸嘀趟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽去件。三九已至,卻和暖如春扰路,著一層夾襖步出監(jiān)牢的瞬間尤溜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工汗唱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宫莱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓哩罪,卻偏偏與公主長得像授霸,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子际插,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348