Rust 交叉编译到安卓

近期公司正在搞一些移动端的东西,然后需要给 Rust 做一下安卓的 binding。是加密相关的一个库,binding 其实不难,只要协同两方的数据格式就好了。难在交叉编译到目标平台,尤其是 rust 做了 C 的binding,然后又要给移动端做 Rust 的 binding。

下面以 编译到 x86_64-linux-android 平台作为一个小记录,

首先你需要添加 Rust 的 Android x86_64 的 target

rustup target add x86_64-linux-android

然后就是尝试交叉编译

RUSTFLAGS="-L /lib/gmp-android-dist/x86_64/ -lgmp" \
CC_x86_64_linux_android="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android30-clang" \
CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android30-clang" \
cargo build --target x86_64-linux-android --release

划重点:RUSTFLAGS="-L /lib/gmp-android-dist/x86_64/ -lgmp" 是你的 Rust 中的 binding 的库,需要指定目标平台编译件的地址。比如我目前 /lib/gmp-android-dist/x86_64/ 路径里面是 Android x86_64 平台可以使用的库文件及头文件。

ls /lib/gmp-android-dist/x86_64/
gmp.h       gmpxx.h     libgmp.so   libgmpxx.so

奶爸总结: toolchain + 引入 Rust 代码中 binding 的库的构建 = 编译成功

Comments