ARM Android 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_DIR/toolchains/llvm/prebuilt/linux-x86_64/bin目录下的工具链。

然后使用生成的或者新版本预编译好的工具链进行编译。

$ ~/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang hello.c -o hello 

然后得到可执行文件 hello

ps: 这里踩了一些坑,参考博客中使用的是x86_64-linux-android21-clang 进行编译,编译后的可执行文件在adb shell 中无法运行,应该使用armv7a-linux-androideabi21-clang进行编译。除此之外,编译的时候不要加--static,否则会报错

error: "./hello": executable's TLS segment is underaligned: alignment is 8, needs to be at least 32 for ARM Bionic

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!了。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/peterwanye/article/details/129773548