30 个稳定版本

3.4.4 2024 年 8 月 10 日
2.19.6 2024 年 8 月 10 日
2.19.3 2023 年 3 月 2 日
2.17.1 2022 年 6 月 4 日
2.10.4 2022 年 1 月 27 日

#42 in FFI

Download history 7/week @ 2024-06-17 104/week @ 2024-07-01 1/week @ 2024-07-22 473/week @ 2024-08-05 118/week @ 2024-08-12

592 每月下载量

BSL-1.0 许可证

61KB
1.5K SLoC

dart-sys

Crates.io Documentation Build

dart FFI 的绑定。

Crate 版本与 Dart SDK 的 发布版 相对应

使用场景

一般要求

  • 将 rust 代码构建为 cdylib

Flutter 应用程序

  • 在为移动设备构建时,需要使用正确的目标(例如,对于 android-arm64,您的 rust 目标必须是 aarch64-linux-android

  • 根据您的目标(例如,对于 android-arm64,您需要将其放置在 arm64-v8a 内)将 rust 库放置在 android/app/src/main/jniLibs

  • 构建 flutter 应用程序;

  • 有关下一步操作,请参阅 Dart 应用程序。Flutter 在 APK 中嵌入您的库,因此您可以仅通过库的全名来引用它。

Dart 应用程序

  • Dart FFI 提供了加载 C 共享库的 API:ffi.DynamicLibrary.open(<共享库路径>);

  • 一旦库成功加载,返回的对象可以用于查找函数指针。

给定以下 rust 函数

#[no_mangle]
pub unsafe extern "C" fn handle(rd: *const c_char) -> i8 {
    //Do something
    return 0;
}

您可以通过以下方式访问其指针

import 'dart:ffi' as ffi;
// External package https://pub.dev/packages/ffi
import 'package:ffi/ffi.dart' as ffiUtils;

typedef NativeFunctionT = ffi.Int8 Function(ffi.Pointer<ffiUtils.Utf8>);
typedef DartFunctionT = int Function(ffi.Pointer<ffiUtils.Utf8>);

final d = ffi.DynamicLibrary.open("my_shared_lib_name.so");
final DartFunctionT sendDataToRust = d.lookupFunction<RustRxNativeFunc, RustRxDartFunc>("handle");

/// Use function to send string data which internally converts it to C compatible char buffer.
void sendNative(DartFunctionT sendDataToRust, String d) {
    final data = d.toNativeUtf8();
    sendDataToRust(data);
    ffiUtils.calloc.free(data);
}

如何更新到新 SDK 版本

  1. Cargo.toml 中更新 version 以等于所需的 SDK 版本

  2. 运行 cargo build --features download-sources,build-bindings

  3. 可选地运行 rustfmt src/lib.rs 以使其更美观

  4. 提交并发布

依赖关系

~170KB