Skip to content

这是一个完整的 Android NDK 与 Rust 集成演示项目,展示了如何将 Rust 代码编译为 Android 动态库并在 Android 应用中使用。

Notifications You must be signed in to change notification settings

jiker-burce/jni_demo

Repository files navigation

Android NDK + Rust 集成演示项目

这是一个完整的 Android NDK 与 Rust 集成演示项目,展示了如何将 Rust 代码编译为 Android 动态库并在 Android 应用中使用。

项目特点

  • ✅ 完整的 Rust 库实现,包含多种 JNI 函数
  • ✅ Android 应用 UI,支持多种功能测试
  • ✅ 自动化的 Gradle 构建集成
  • ✅ 支持多架构编译 (ARM64, ARM32, x86, x86_64)
  • ✅ CMake 配置用于链接 Rust 库
  • ✅ 完整的项目结构和配置文件

功能演示

Rust 库功能

  1. 斐波那契计算 - 高性能的数学计算
  2. 字符串处理 - 字符串转换和格式化
  3. 数组求和 - 数组操作和数据处理
  4. 系统信息 - 获取编译和运行时信息

Android 应用功能

  • 直观的 Material Design UI
  • 实时结果显示
  • 多种测试按钮
  • 错误处理和用户反馈

技术架构

Android App (Kotlin)
    ↓ JNI 调用
Rust Library (.so)
    ↓ 编译为
Android NDK 动态库

环境要求

必需软件

  • Android Studio (最新版本)
  • Android NDK (通过 SDK Manager 安装)
  • Rust (通过 rustup 安装)
  • Java 8+Java 11+

环境变量设置

# 设置 Android NDK 路径
export ANDROID_NDK_HOME=/path/to/your/ndk
export ANDROID_NDK_ROOT=/path/to/your/ndk

# 验证 Rust 安装
rustc --version
cargo --version

快速开始

1. 设置 Rust Android 编译目标

# 运行设置脚本
chmod +x setup_rust_targets.sh
./setup_rust_targets.sh

# 或手动添加
rustup target add aarch64-linux-android
rustup target add armv7-linux-androideabi
rustup target add i686-linux-android
rustup target add x86_64-linux-android

2. 编译 Rust 库

# 使用构建脚本
chmod +x build_rust.sh
./build_rust.sh

# 或手动编译
cd rust
cargo build --target aarch64-linux-android --release

3. 构建 Android 应用

# 在 Android Studio 中打开项目
# 或使用命令行构建
./gradlew assembleDebug

4. 运行应用

  • 连接 Android 设备或启动模拟器
  • 在 Android Studio 中点击运行按钮
  • 或安装 APK: ./gradlew installDebug

项目结构

rust_jni_demo/
├── rust/                          # Rust 库项目
│   ├── Cargo.toml                 # Rust 项目配置
│   └── src/
│       └── lib.rs                 # Rust 库源码
├── app/                           # Android 应用
│   ├── build.gradle.kts           # 应用构建配置
│   └── src/main/
│       ├── java/com/example/rustndk/
│       │   └── MainActivity.kt    # 主活动
│       ├── cpp/                   # C++/NDK 代码
│       │   ├── CMakeLists.txt     # CMake 配置
│       │   └── native-lib.cpp     # C++ 示例代码
│       ├── res/                   # Android 资源
│       └── AndroidManifest.xml    # 应用清单
├── build.gradle.kts               # 项目级构建配置
├── settings.gradle.kts            # Gradle 设置
├── setup_rust_targets.sh          # Rust 目标设置脚本
├── build_rust.sh                  # Rust 编译脚本
└── README.md                      # 项目文档

核心实现原理

1. Rust 库配置

[lib]
name = "android_rust_lib"
crate-type = ["cdylib"]  # 编译为 C 兼容的动态库

2. JNI 函数定义

#[no_mangle]
pub extern "C" fn Java_com_example_rustndk_MainActivity_calculateFibonacci(
    _env: JNIEnv,
    _class: JClass,
    n: jint,
) -> jint {
    calculate_fibonacci(n)
}

3. Gradle 构建集成

tasks.register<Exec>("compileRust") {
    workingDir = rustBasePath
    commandLine("cargo", "build", "--target", "aarch64-linux-android", "--release")
    environment("ANDROID_NDK_HOME", android.ndkDirectory.absolutePath)
}

4. CMake 链接配置

add_library(android_rust_lib SHARED IMPORTED)
set_target_properties(android_rust_lib PROPERTIES
    IMPORTED_LOCATION "${RUST_LIB_DIR}/libandroid_rust_lib.so"
)

要点

技术深度展示

  1. 内存安全: Rust 的内存安全特性如何避免 NDK 开发中的常见崩溃
  2. 性能优势: Rust 零成本抽象和编译时优化
  3. 构建集成: 深入理解 Gradle Task 系统和构建流程
  4. 跨平台: 多架构编译和部署策略

实际应用场景

  • 高性能计算模块
  • 加密和安全功能
  • 图像和音视频处理
  • 网络协议实现
  • 游戏引擎核心

扩展能力

  • 与现有 C++ 代码的互操作
  • 第三方 Rust crate 的集成
  • 调试和性能分析工具
  • CI/CD 自动化构建

常见问题

Q: 如何调试 Rust NDK 代码?

A: 可以使用 android_log crate 输出日志,或使用 GDB 进行调试。

Q: 如何处理 Rust 和 Java 之间的异常?

A: 在 Rust 中使用 JNIEnv 的异常处理函数,在 Java 中捕获 UnsatisfiedLinkError

Q: 如何优化编译时间?

A: 使用 sccache 缓存编译结果,并行编译多个目标架构。

Q: 如何集成第三方 Rust 库?

A: 在 Cargo.toml 中添加依赖,确保所有依赖都支持 Android 目标。

贡献指南

  1. Fork 项目
  2. 创建功能分支
  3. 提交更改
  4. 推送到分支
  5. 创建 Pull Request

许可证

MIT License - 详见 LICENSE 文件

联系方式

如有问题或建议,请创建 Issue 或联系项目维护者。


注意: 这是一个演示项目,用于学习和面试准备。在生产环境中使用时,请确保进行充分的测试和安全审查。

面试

  • 有合适的rust岗位希望大家可以推荐,以后会陆续推出各种demo项目共大家研究学习,共同进步。
  • 邮箱:storefee@163.com

About

这是一个完整的 Android NDK 与 Rust 集成演示项目,展示了如何将 Rust 代码编译为 Android 动态库并在 Android 应用中使用。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published