# RustAndroid
本项目展示了如何在 Android 应用中集成 Rust 原生库,结合了:
- **Rust**: 用于编写高性能的原生代码
- **JNI**: 作为 Rust 和 Android 之间的桥梁
## 🏗️ 项目结构
```
RustAndroid/
├── app/ # Android 应用模块
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/com/example/rustandroid/
│ │ │ │ ├── MainActivity.kt # 主活动
│ │ │ │ └── RustJni.kt # JNI 接口封装
│ │ │ ├── jniLibs/ # 编译后的 .so 文件存放位置
│ │ │ │ ├── arm64-v8a/
│ │ │ │ └── armeabi-v7a/
│ │ │ └── AndroidManifest.xml
│ │ └── test/
│ └── build.gradle # Android 构建配置
│
├── rust-jni/ # Rust 原生库
│ ├── src/
│ │ └── lib.rs # Rust JNI 实现
│ ├── Cargo.toml # Rust 项目配置
│ └── target/ # Rust 编译产物
│
├── build.gradle # 根项目构建配置
├── settings.gradle # Gradle 设置
└── README.md # 项目文档
```
## 🚀 快速开始
### 前置要求
1. **安装 Rust**
```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
2. **添加 Android 交叉编译目标**
```bash
rustup target add aarch64-linux-android
rustup target add armv7-linux-androideabi
```
### 构建和运行
1. **编译项目**
```bash
./gradlew assembleDebug
```
2. **在 Android Studio 中运行**
- 点击Run按钮或按 `Shift + F10`
## 🔧 工作原理
### 1. Rust 侧(rust-jni/src/lib.rs)
```rust
#[unsafe(no_mangle)]
pub extern "C" fn Java_com_example_rustandroid_RustJni_hello<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
input: JString<'local>,
) -> jstring {
// Rust 原生代码处理逻辑
let input_str: String = env.get_string(&input).unwrap().into();
let output = env.new_string(format!("Hello, {}! (from Rust)", input_str)).unwrap();
output.into_raw()
}
```
### 2. Android 侧(RustJni.kt)
```kotlin
object RustJni {
init {
System.loadLibrary("rust_jni") // 加载 Rust 编译的 .so 库
}
@JvmStatic
external fun hello(input: String): String // 声明原生方法
}
```
### 3. 自动化编译流程
项目在 `app/build.gradle` 中配置了自动化的 Rust 编译任务:
- **buildRust**: 为所有目标架构编译 Rust 代码
- **cleanRust**: 清理 Rust 编译产物
- 自动在构建前执行 Rust 编译
## ⚙️ 优化配置
### Rust Release 优化
项目配置了多项编译优化以减小库体积和提升性能:
```toml
[profile.release]
opt-level = 3 # 最大优化级别
lto = true # 链接时优化
codegen-units = 1 # 单线程编译获得最佳优化
strip = true # 去除调试符号
panic = 'abort' # panic 时直接终止
```
### Android 15+ 适配
支持 16KB 页面大小,适配 Android 15 及更高版本:
```gradle
environment "${envVarPrefix}_RUSTFLAGS", "-C link-arg=-Wl,-z,max-page-size=16384"
```
## 🐛 常见问题
### 1. Rust 编译失败
**问题**: cargo 命令未找到或编译失败
**解决方案**:
- 确保已安装 Rust: `rustup --version`
- 确保已添加 Android 目标: `rustup target list --installed`
- 检查环境变量配置
### 2. JNI 方法未找到
**错误**: "UnsatisfiedLinkError: No implementation found"
**解决方案**:
- 检查 Rust 函数名是否与 Kotlin 包名和类名匹配
## 📚 学习资源
- [Rust JNI 文档](https://docs.rs/jni/)
- [Rust 官方文档](https://www.rust-lang.org/learn)