为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

Image of SDK Manager

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!了。

参考资料

posted @ 2020-09-23 20:30  星夜之夏  阅读(1797)  评论(0编辑  收藏  举报