序
本系列文章将从rust
环境搭建开始,逐步带大家了解使用rust
进行Android
JNI
开发的基本技能.相关文章共分为如下几步:
Rust JNI
环境搭建.- 创建第一个
Rust JNI
项目 Rust
与Android
互相调用Rust
调用Android API
实现签名验证Rust
使用openssl
实现Android
签名验证
每一章文末都会稍带一些扩展知识,大家了解即可,真正需要时再去细究.
安装
在Linux
或者mac
上安装rust
一行命令
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
如果你使用的是Windows
系统,可以参考https://www.rust-lang.org/tools/install
和https://course.rs/first-try/installation.html
验证rust是否安装成功
- 验证
rustc
,命令行输入:
rustc --version
安装成功的话会有如下输出:
rustc 1.65.0 (897e37553 2022-11-02)
其中1.65.0 (897e37553 2022-11-02)
为版本号,读者们不必追求版本号与文章一致,以本地的版本号为准.
- 验证
cargo
,命令行输入:
cargo --version
输出如下:
cargo 1.65.0 (4bc8f24d3 2022-10-20)
同样,1.65.0 (4bc8f24d3 2022-10-20)
只是版本号,不必追求与文章一致.
交叉编译环境
rust
安装交叉编译组件,其中:
aarch64-linux-android
对应 arm64-v8a
armv7-linux-androideabi
对应 armeabi-v7a
我们以aarch64-linux-android
为例,安装命令如下:
rustup target add aarch64-linux-android
- 验证
安装完成后,使用以下命令进行验证:
rustup target list
获取输出如下:
aarch64-apple-darwin
aarch64-apple-ios
aarch64-apple-ios-sim
aarch64-fuchsia
aarch64-linux-android (installed)
aarch64-pc-windows-msvc
aarch64-unknown-linux-gnu
aarch64-unknown-linux-musl
aarch64-unknown-none
aarch64-unknown-none-softfloat
arm-linux-androideabi
arm-unknown-linux-gnueabi
arm-unknown-linux-gnueabihf
arm-unknown-linux-musleabi
...
其中aarch64-linux-android (installed)
,代表我们已经安装好aarch64-linux-android
组件了.
同时我们也可以看到,rust交叉编译所支持的平台非常多,更加完整的介绍可见https://doc.rust-lang.org/nightly/rustc/platform-support.html
.
- 配置
config
文件
- 在
~/.cargo
文件夹下,查看是否存在名为config
的文件,不存在的话直接创建即可. - 编辑
config
文件,内容如下:
[target.aarch64-linux-android]
ar = "<path>/NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"
linker = "<path>/NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang"
另请注意,rust
官方关于配置ndk
的文档已经很久没更新过了,仅供参考https://mozilla.github.io/firefox-browser-architecture/experiments/2017-09-21-rust-on-android.html
. 文中所说${NDK_HOME}/build/tools/make_standalone_toolchain.py --api 26 --arch arm64 --install-dir NDK/arm64
这部分操作已经不再需要了.在我的NDK
版本22.1.7171670
下已经内置了aarch64-linux-android-ar
和aarch64-linux-android30-clang
,不再需要重新编译.
扩展知识(了解即可,等到真正需要的时候再去研究)
cross (https://github.com/cross-rs/cross
)
“Zero setup” cross compilation and “cross testing” of Rust crates
cross
这个工具会让交叉编译更简单,简单理解就是cross
在容器里已经配置好了NDK
等环境,我们只管开发完代码之后执行 cross build --target aarch64-linux-android --release
就可编译出android
对应的arm64-v8a
的so
文件了,不再需要在本机上再手动配置NDK
和config
文件.笔者本机环境Ubuntu 22.04
使用cross
编译android
平台的so
文件,x86_64
的Windows
可执行文件以及mips
的路由器端可执行文件,使用起来很方便.
结语
本章结束后,本机环境信息如下
$ rustc --version
rustc 1.65.0 (897e37553 2022-11-02)
$ cargo --version
cargo 1.65.0 (4bc8f24d3 2022-10-20)
NDK
: 22.1.7171670
交叉编译组件:aarch64-linux-android
我们将在此环境下开始接下来的rust-jni
的学习.
Android
项目地址:https://github.com/tangxuesong6/Android_Rust_JNI_Demo
rust
项目地址:https://github.com/tangxuesong6/Rust_JNI_Demo