Rust目前在互联网上资料较少,经过几天的折腾,终于在 Windows10 和 Github Actions (Ubuntu) 上构建出了 armv7 和 armv8 的 .so文件。
-
关于JNI的配置见:【Rust实现JNI】https://juejin.cn/post/7092750468631740452
-
交叉编译需要Android NDK, 我目前使用的是
android-ndk-r25c
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