用 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、豆包等)辅助解决,效率更高!

THE END