Rust交叉编译为Android库

发布时间 2023-08-03 17:50:34作者: jing砸鸭

Rust目前在互联网上资料较少,经过几天的折腾,终于在 Windows10 和 Github Actions (Ubuntu) 上构建出了 armv7 和 armv8 的 .so文件。



Windows

由于Android NDK 的 CMD脚本问题,故无法使用新版的 Rustc,所以需要确保你的版本 小于等于 1.68.2 (2023-03-27)。(截至1.71.0 (2023-07-12)还未解决此问题)

配置环境

一般有两种方法

方法一:
  • ~/.cargo/config.toml文件写入如下内容:

注意结尾为 clang++,如果是linux系统则将.cmd换为.sh

[target.aarch64-linux-android]
ar = "E:\\Android_NDK\\android-ndk-r25c\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\llvm-ar"
linker = "E:\\Android_NDK\\android-ndk-r25c\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\aarch64-linux-android21-clang++.cmd"

[target.armv7-linux-androideabi]
ar = "E:\\Android_NDK\\android-ndk-r25c\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\llvm-ar"
linker = "E:\\Android_NDK\\android-ndk-r25c\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\armv7a-linux-androideabi21-clang++.cmd"

方法二:

使用环境变量CC AR

Rust文档中说明 环境变量优先级大于config.toml, 具体并未测试,如冲突,请先将config.toml移除。

Linux:
export ANDROID_NDK=NDK目录

export CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++
export AR=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar

# 一般配置 CC, AR 即可,如出现问题再将以下3条加上:
export TARGET_CC=$CC
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$CC
export CARGO_TARGET_AARCH64_LINUX_ANDROID_AR=$AR

Rust 交叉工具链安装

rustup target add aarch64-linux-android
rustup target add armv7-linux-androideabi

# 查看已安装 结尾带(Installed)
rustup target list

最后在项目根目录下执行

cargo build --target aarch64-linux-android --release
cargo build --target armv7-linux-androideabi --release

生成的.so文件位于以下目录

./target/aarch64-linux-android/release
./target/armv7-linux-androideabi/release