50 个版本 (稳定)

新版本 3.5.7 2024 年 8 月 19 日
3.5.6 2024 年 5 月 20 日
3.5.4 2024 年 4 月 13 日
3.4.0 2023 年 9 月 23 日
0.1.3 2018 年 7 月 22 日

#21 in Cargo 插件

Download history 10957/week @ 2024-05-03 11447/week @ 2024-05-10 12334/week @ 2024-05-17 9714/week @ 2024-05-24 10152/week @ 2024-05-31 10039/week @ 2024-06-07 10394/week @ 2024-06-14 9969/week @ 2024-06-21 10543/week @ 2024-06-28 11045/week @ 2024-07-05 10805/week @ 2024-07-12 11357/week @ 2024-07-19 11328/week @ 2024-07-26 10166/week @ 2024-08-02 9837/week @ 2024-08-09 8219/week @ 2024-08-16

41,452 每月下载量

Apache-2.0 OR MIT

68KB
1.5K SLoC

cargo-ndk - 为 Android 构建 Rust 代码

CI Minimum supported Rust version: 1.73

此 cargo 扩展处理从 Rust 代码库成功构建 Android 库所需的所有环境配置,支持生成正确的 jniLibs 目录结构。

安装

cargo install cargo-ndk

您还需要安装所有打算使用的工具链。最简单的方法是使用以下命令

rustup target add \
    aarch64-linux-android \
    armv7-linux-androideabi \
    x86_64-linux-android \
    i686-linux-android

根据您的使用情况进行必要的修改。

用法

如果您已将 NDK 安装到 Android Studio 的默认位置,cargo ndk 将自动检测最新的 NDK 版本并使用它。这可以通过在 ANDROID_NDK_HOME 环境变量中指定 NDK 根目录的路径来覆盖。

示例

为 32 位和 64 位 ARM 系统构建库

cargo ndk -t armeabi-v7a -t arm64-v8a -o ./jniLibs build --release

这指定了要构建的 Android 目标(也支持普通三重),用于放置 Android 期望的 .so 文件的输出目录,然后是传递给 cargo 的普通标志。

Example

libc++_shared.so 链接到输出目录的相关位置并复制

在您的项目中创建一个 build.rs 文件,内容如下

use std::{env, path::{Path, PathBuf}};

fn main() {
    if env::var("CARGO_CFG_TARGET_OS").unwrap() == "android" {
        android();
    }
}

fn android() {
    println!("cargo:rustc-link-lib=c++_shared");

    if let Ok(output_path) = env::var("CARGO_NDK_OUTPUT_PATH") {
        let sysroot_libs_path =
            PathBuf::from(env::var_os("CARGO_NDK_SYSROOT_LIBS_PATH").unwrap());
        let lib_path = sysroot_libs_path.join("libc++_shared.so");
        std::fs::copy(
            lib_path,
            Path::new(&output_path)
                .join(&env::var("CARGO_NDK_ANDROID_TARGET").unwrap())
                .join("libc++_shared.so"),
        )
        .unwrap();
    }
}

控制详细程度

添加 -v-vv,就像您通常在 cargo 命令之后做的那样。

提供 C 依赖项的环境变量

cargo-ndk 以与 cc 包相同的方式推导要读取哪些环境变量。

cargo-ndk 特定的环境变量

这些环境变量已导出供构建脚本和其他下游用例使用

  • CARGO_NDK_ANDROID_PLATFORM:Android平台API编号(整数值,例如 21
  • CARGO_NDK_ANDROID_TARGET:构建目标的Android名称(例如 armeabi-v7a
  • CARGO_NDK_OUTPUT_PATH:使用 -o 标志指定的输出路径
  • CARGO_NDK_SYSROOT_PATH:Android NDK中sysroot的路径
  • CARGO_NDK_SYSROOT_TARGET:sysroot中文件的目标名称(与标准LLVM triples略有不同)
  • CARGO_NDK_SYSROOT_LIBS_PATH:给定sysroot目标的sysroot中库的路径(例如 $CARGO_NDK_SYSROOT_PATH/usr/lib/$CARGO_NDK_SYSROOT_TARGET

打印环境变量

有时您只想查看 cargo-ndk 配置的环境变量,以便您可以在 VS Code 或类似的环境中设置 rust-analyzer。

如果要将它源到您的bash环境中

source <(cargo ndk-env)

PowerShell

cargo ndk-env --powershell | Out-String | Invoke-Expression

Rust Analyzer 以及任何其他基于 JSON 的环境处理的工具

要配置 rust-analyzer,请添加 --json 标志并将 blob 粘贴到配置中的相关位置。

支持的主机

  • Linux
  • macOS(x86_64arm64
  • Windows

本地开发

git clone 然后使用 cargo 安装 crate

cargo install --path .

类似的项目

  • cargo-cocoapods - 用于构建所有 Apple 平台的 .a 文件,并捆绑为 CocoaPods

许可

本项目许可为以下之一

任选其一。

依赖

~3–12MB
~138K SLoC