rust-jni-android 1.0.0

Rust JNI bindings for Android - seamlessly integrate Rust code into Android applications
Documentation
# 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
   # 访问 https://rustup.rs/ 安装 Rust

   # 或使用以下命令(Linux/macOS):

   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