最近調試安卓上的 ARM 程序,涉及到一些 C 語言內容。為了方便調試,看看打印啥的,希望能自己寫個簡單的C程序,在本地(Ubuntu主機)交叉編譯后傳到手機上運行,看結果。
為了實現交叉編譯,需要 Google 官方的NDK(Native Development Kit)。使用 NDK 提供的編譯器進行編譯,然后通過 adb 上傳到手機運行。
具體做法如下:
1、安裝 Android Studio
網上有很多帖子介紹安裝方法,Android studio官網也有安裝方法介紹。這里簡單說一下 Ubuntu 18.04 (64 bit) 上的安裝過程。
- 安裝依賴庫:
sudo apt update
sudo apt install openjdk-8-jdk # Must be openjdk 8
java -version # Check java version
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386 # For 64-bit Ubuntu
-
下載 Android Studio:去官網下載, 得到壓縮文件(.tar.gz)。
-
將文件解壓合適目錄:例如:全局安裝可解壓到
/opt/
目錄下。給自己安裝可解壓到/usr/local/
或/home/YourName/
sudo tar xzvf android-studio-ide-xxx.xxxxx-linux.tar.gz -C /opt/
- 運行安裝腳本(會啟動圖形界面)
/opt/android-studio/bin/studio.sh
- 按照提示進行操作
- 最后安裝的目錄和解壓目錄不同,可能是
~/Android/Sdk
目錄下。
2、安裝 NDK
可參考官網介紹。安裝好 Android Studio 后,同樣通過以下命令啟動 Android Studio:
/opt/android-studio/bin/studio.sh
注意第一次啟動要先建立一個 Android 項目。這個按照提示建立一個空的項目即可,后面不會用到這個項目。
打開任意項目后(例如剛才新建的空項目),進入主界面。上方菜單選擇:Tools > SDK Manager。
在打開的窗口的右上方,選擇SDK Tools標簽。復選框中選擇NDK (Side by side)和CMake,然后點OK。
后續按照提示操作即可安裝。假設安裝 NDK 的目錄為$NDK_DIR

3、編寫C程序並編譯
用任意編輯器編寫一個簡單的C語言程序,例如 hello_world.c
:
#include <stdio.h>
int main()
{
printf("Hello, world!");
return 0;
}
接下來用工具鏈編譯。注意如果是比較早的NDK版本,需要先手動生成工具鏈:
$NDK_DIR/build/tools/make_standalone_toolchain.py --arch arm --api 21 --install-dir ./toolchain
參數中指定了目標平台(arm)、API水平(21)和生成目錄。生成的工具鏈位於./toolchain
目錄下。
不過現在新版本的NDK已經不需要這樣了。可以直接使用$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64/bin
目錄下的工具鏈。
然后使用生成的或者新版本預編譯好的工具鏈進行編譯。
$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android21-clang hello_world.c -o hello_world_arm
然后得到可執行文件 hello_world_arm
4、傳送到設備並運行
將Android設備(如手機)通過USB或局域網連接主機。將編譯好的可執行文件通過adb
上傳到設備,然后用adb shell
命令行運行。假設主機和手機已經建立了adb
連接,命令行中執行:
adb push ./hello_world_arm /data/local/tmp
adb shell
接下來在adb shell
中執行:
cd /data/local/tmp
./hello_world_arm
就可以看到打印出Hello, world!
了。
參考資料