本文假定cargo和rust已安装,如果没有安装 自行百度,一般不会有问题。编辑器推荐使用vscode
1.首先下载好sdk:
找到 `Android SDK > SDK Tools`,如果是在Android studio中,setting中寻找:`Android Studio > Preferences > Appearance & Behaviour > Android SDK > SDK Tools`。最后检查一下选项:
```
* Android SDK Tools
* NDK
* CMake
* LLDB
```
2.配置环境变量(配置方法自行百度):
ANDROID_HOME = SDK的根目录
ANDROID_NDK_HOME 也有可能是 NDK_HOME = NDK的根目录
3.创建NDK目录(所需较大硬盘空间) 用到 python:
cd 到NDK的tools目录底下有个 make_standalone_toolchain.py 文件用命令
python3 make_standalone_toolchain.py --api 30 --arch arm64 --install-dir NDK/arm64
python3 make_standalone_toolchain.py --api 30 --arch arm --install-dir NDK/arm
python3 make_standalone_toolchain.py --api 30 --arch x86 --install-dir NDK/x86
4.项目交叉编译配置:
创建`cargo-config.toml`文件,将NDK地址配置在里面,以及cpu架构对应的配置:
```.env
[target.aarch64-linux-android]
ar = "{yourpath}\\arm64\\bin\\aarch64-linux-android-ar.exe"
linker = "{yourpath}\\arm64\\bin\\aarch64-linux-android-clang.cmd"
[target.armv7-linux-androideabi]
ar = "{yourpath}\\arm\\bin\\arm-linux-androideabi-ar.exe"
linker = "{yourpath}\\arm\\bin\\arm-linux-androideabi-clang.cmd"
[target.i686-linux-android]
ar = "{yourpath}\\x86\\bin\\i686-linux-android-ar.exe"
linker = "{yourpath}\\x86\\bin\\i686-linux-android-clang.cmd"
```
5.将cargo交叉编译配置信息添加到cargo目录下:
复制配置文件
复制cargo-config.toml 到.cargo/config .cargo这个文件夹一般在用户应用数据文件夹里面没有config文件 就新建一个
继续添加新创建的Android体系结构,rustup以便我们可以在交叉编译期间使用它们:
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android
6.rust jni配置:
我们声明需要jni包地址,这意味着我们需要在`Cargo.toml`文件中包含包装箱。打开它,并在`[package]`和`[lib]`声明之间添加以下内容。
```.env
[target.'cfg(target_os="android")'.dependencies]
jni = { version = "0.16.0", default-features = false }
```
指定交叉编译的库,在`Cargo.toml`文件中的`[lib]`部分中指定,Android所需的是动态库,`.so`后缀
```.env
[lib]
crate-type = ["cdylib"]
```
7.执行编译
在Terminal中打开项目地址,导航到`cargo`目录下运行以下命令
```.env
cargo build --target aarch64-linux-android --release
cargo build --target armv7-linux-androideabi --release
cargo build --target i686-linux-android --release
```
运行后生成的路径在:
```
<project path>/target
```
其中生成包与Android studio `jniLibs` 下架构对应为:
```.env
arm64-v7a = aarch64-linux-android
armeabi-v7a = armv7-linux-androideabi
x86 = i686-linux-android
```
生成so包之后,使用方式与c的so包一致。
ps:遇到了一些坑,当项目中有依赖openssl或者 依赖的依赖有引入openssl,一定要记住下载对应版本的openssl,比如 我这边是要编译android使用的,就下载openssl:arm-android或者openssl:arm64-android。
windows推荐使用vcpkg包管理器,配置好vcpkg的环境变量下载openssl,配置好openssl的环境变量。
至于C,C++环境的问题,比如出现了clang gcc clang++等一系列问题, 下载visual studio 配置选项可以解决。
总结:环境的问题很头疼,资料又少,这个openssl的问题卡了我很久,希望广大程序猿们 不要遇到这种类似问题,很伤头发。