編譯環(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-bundle
的ndk-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ā)者來說是最便利的方法之一。