CMake編譯Android可執(zhí)行程序

編譯環(huán)境

  • 通過過Android Studio內置的SDK Manager下載NDK和CMake矫夷;
  • 把環(huán)境變量ANDROID_SDK_HOME指向Android SDK目錄仇参,并把ANDROID_SDK_HOME添加到PATH環(huán)境變量中。

HelloWorld

HelloWorld是每個程序員編寫的第一個程序,因此本例也從HelloWorld開始藻治。這里為了便于后續(xù)項目的編譯和管理,首先新建文件夾helloworld巷挥,然后在此文件夾下編寫helloworld.c源文件:

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
    return 0;
}

CMakeLists.txt

由于使用CMake進行編譯可執(zhí)行程序桩卵,需要配置文件CMakeLists.txt。在helloworld文件夾下編寫CMakeLists.txt:

# CMake最低版本號要求
cmake_minimum_required(VERSION 3.6)

# 項目信息
project (helloworld)

# 設置目標文件的名字
set(TARGET_NAME helloworld)

# 生成可執(zhí)行文件
add_executable(${TARGET_NAME}
                helloworld.c
)

build腳本

在執(zhí)行cmake命令生成Android可執(zhí)行文件時需要帶上長長的參數(shù)倍宾,為了簡化此步驟雏节,這里編寫一個腳本build.bat

set abi=armeabi-v7a

if not exist %abi% md %abi%
cd %abi%

%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/cmake ^
  -DANDROID_ABI=%abi% ^
  -DANDROID_NDK=%ANDROID_SDK_HOME%/ndk-bundle ^
  -DCMAKE_BUILD_TYPE=Debug ^
  -DCMAKE_TOOLCHAIN_FILE=%ANDROID_SDK_HOME%/ndk-bundle/build/cmake/android.toolchain.cmake ^
  -DANDROID_NATIVE_API_LEVEL=9 ^
  -DANDROID_TOOLCHAIN=clang -DCMAKE_GENERATOR="Ninja" ^
  -DCMAKE_MAKE_PROGRAM=%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/ninja ^
  ..

%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/ninja
cd ..

腳本中的3.10.2.4988404指的是CMake的版本,需要根據(jù)實際下載的CMake版本進行修改凿宾。執(zhí)行此腳本矾屯,將在helloworld/armeabi-v7a目錄下生成helloworld可執(zhí)行文件。

編譯腳本中%ANDROID_SDK_HOME%/ndk-bundlendk-bundle可能不是這個文件夾初厚,比如現(xiàn)在版本AndroidStudio下載的Ndk文件夾就是sdk\ndk\20.1.5948944件蚕,要將編譯腳本中的ndk-bundle替換為ndk\20.1.5948944

由于使用的是Windows系統(tǒng),這里給出的是bat腳本产禾,Linux/Mac的shell腳本可根據(jù)bat腳本進行相應的修改排作。

運行測試

使用Android手機通過USB數(shù)據(jù)線連接電腦,或者使用模擬器亚情,獲取root權限:

adb root
adb shell

進入shell后妄痪,獲取root權限會顯示:

generic_x86_64:/ #

進入shell后,未獲取root權限會顯示:

generic_x86_64:/ $

將生成的helloworld可執(zhí)行文件通過adb命令push到設備上:

adb push helloworld /data/local/tmp

使用adb shell命令進入Android命令終端楞件,在運行helloworld之前衫生,先為helloworld文件添加可執(zhí)行權限:

chmod 777 /data/local/tmp/helloworld

執(zhí)行helloworld命令可以看到如下輸出:

generic_x86_64:/ # /data/local/tmp/helloworld
./helloworld not executable :32-bit ELF file

又是一個坑,在使用AndroidStudio的模擬器時候土浸,因為我們編譯出來的是armeabi-v7a的可執(zhí)行文件罪针,所以在創(chuàng)建模擬器的時候也要創(chuàng)建相對應的模擬器,不能使用x86的模擬器黄伊。

模擬器

啟動模擬器后泪酱,重復上面的步驟,最終我們可以看到下面的輸出:

generic:/data/local/tmp # ./helloworld
Hello World!

總結

編譯Android可執(zhí)行程序可以使用ndk-build,不過官方已經不推薦使用了墓阀;也可在Android源碼的中進行編譯毡惜,可是Android源碼的編譯環(huán)境也不容易搭建,如果已有編譯環(huán)境的情況下另當別論斯撮;因此本例利用Android Studio中的CMake和NDK進行編譯可執(zhí)行文件经伙,對于Android應用開發(fā)者來說是最便利的方法之一。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吮成,一起剝皮案震驚了整個濱河市橱乱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粱甫,老刑警劉巖泳叠,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野揪,死亡現(xiàn)場離奇詭異爪瓜,居然都是意外死亡,警方通過查閱死者的電腦和手機掰派,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門乌庶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來种蝶,“玉大人,你說我怎么就攤上這事瞒大◇φ鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵透敌,是天一觀的道長盯滚。 經常有香客問我,道長酗电,這世上最難降的妖魔是什么魄藕? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮撵术,結果婚禮上背率,老公的妹妹穿的比我還像新娘。我一直安慰自己嫩与,他們只是感情好寝姿,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著划滋,像睡著了一般会油。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上古毛,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼稻薇。 笑死嫂冻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的塞椎。 我是一名探鬼主播桨仿,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼案狠!你這毒婦竟也來了服傍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骂铁,失蹤者是張志新(化名)和其女友劉穎吹零,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拉庵,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡灿椅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钞支。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茫蛹。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烁挟,靈堂內的尸體忽然破棺而出婴洼,到底是詐尸還是另有隱情,我是刑警寧澤撼嗓,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布柬采,位于F島的核電站,受9級特大地震影響静稻,放射性物質發(fā)生泄漏警没。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一振湾、第九天 我趴在偏房一處隱蔽的房頂上張望杀迹。 院中可真熱鬧,春花似錦押搪、人聲如沸树酪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽续语。三九已至,卻和暖如春厦画,著一層夾襖步出監(jiān)牢的瞬間疮茄,已是汗流浹背滥朱。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留力试,地道東北人徙邻。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像畸裳,于是被迫代替她去往敵國和親缰犁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355