用 Rust 编写 Android 本地模块(.so 文件)全流程教学
Rust 是近年来广受欢迎的新兴编程语言,凭借其内存安全、高性能等特性,在系统编程、嵌入式开发和移动端开发中逐渐崭露头角。
本教程将详细介绍如何将 Rust 编译为 Android 可用的 .so
文件,并在 Android 应用中成功调用。
📌 适用人群:有一定 Rust 和 Android 开发基础,了解 Cargo 和 Android Studio 基本用法
📌 实用场景:Rust 高性能模块嵌入 Android、使用香港服务器部署跨平台应用等
一、编译 Rust 代码为 Android .so
文件
1. 创建 Rust 项目
cargo new so_rust
2. 编辑 Cargo.toml
添加 JNI 依赖和 crate-type
配置:
[package]
name = "so_rust"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
jni = { version = "0.19.0", default-features = false }
📌 cdylib
表示生成动态链接库(Android 基于 Linux,会生成 .so
文件)
3. 编写核心逻辑:src/lib.rs
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
#[allow(non_snake_case)]
pub mod android {
use super::add;
use jni::objects::*;
use jni::sys::*;
#[no_mangle]
pub unsafe extern "C" fn Java_com_sprite_donk_Adder_add(
_env: JNIEnv,
_class: JClass,
num_a: jint,
num_b: jint,
) -> jint {
add(num_a, num_b)
}
}
⚠️ 函数名 Java_com_sprite_donk_Adder_add
有特殊格式:
Java_包名_类名_方法名
,其中 com_sprite_donk
可以随意,只需和 Java 层对应。
4. 配置交叉编译:.cargo/config
[target.aarch64-linux-android]
linker = "/Users/xxx/Library/Android/sdk/ndk/28.0.12433566/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android22-clang"
✅ 指定目标平台为 aarch64-linux-android
,linker 是 Android NDK 中的编译器路径。
5. 构建 .so
文件
cargo build --target aarch64-linux-android --release
成功后会生成:
target/aarch64-linux-android/release/libso_rust.so
二、在 Android 项目中使用 .so
文件
1. 放置 .so
文件
将 libso_rust.so
放入 Android 工程目录:
app/src/main/jniLibs/arm64-v8a/
📌 jniLibs/arm64-v8a
是专为 ARM64 架构的手机设计的原生库目录。
2. 创建对应的 Java 类
路径:app/src/main/java/com/sprite/donk/Adder.java
package com.sprite.donk;
public class Adder {
static {
System.loadLibrary("so_rust");
}
public static native int add(int numA, int numB);
}
⚠️ 文件名需为 Adder.java
,包名必须和 native 方法定义保持一致。
3. 在 Kotlin 中调用
在 MainActivity.kt
中使用:
import com.sprite.donk.Adder
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
try {
val res = Adder.add(10, 20)
Log.i("MainActivityResult", res.toString())
} catch (e: Error) {
Log.i("MainActivityError", e.message.toString())
}
}
}
📌 Kotlin 可直接调用 Java 类定义的 native 方法。
三、运行与调试
使用 Android Studio 编译并运行项目,打开 Logcat 即可查看输出结果。
🔚 总结
将 Rust 编译为 Android 可用的 .so
文件,是实现高性能模块嵌入的极佳方式。
你还可以选择使用 Mozilla 官方推荐的 Rust Android Gradle 插件 简化流程。
🚀 延伸建议:结合 香港服务器 与 Rust 模块,你可以构建更安全、高性能、跨平台的移动端架构,适用于海外部署、数据加速、边缘计算等场景。
📩 如果你在配置过程中遇到困难,不妨试试 AI 工具(如 ChatGPT、豆包等)辅助解决,效率更高!