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
592 每月下载量
61KB
1.5K SLoC
dart-sys
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 版本
-
在
Cargo.toml
中更新version
以等于所需的 SDK 版本 -
运行
cargo build --features download-sources,build-bindings
-
可选地运行
rustfmt src/lib.rs
以使其更美观 -
提交并发布
依赖关系
~170KB