为ARM安卓设备交叉编译C/C++语言程序
最近调试安卓上的 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!
了。
参考资料