https://github.com/doumanash/dart-sys
Rust bindings to dart sdk
https://github.com/doumanash/dart-sys
dart dart-ffi flutter rust
Last synced: 2 months ago
JSON representation
Rust bindings to dart sdk
- Host: GitHub
- URL: https://github.com/doumanash/dart-sys
- Owner: DoumanAsh
- License: bsl-1.0
- Created: 2021-03-23T15:44:49.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2024-08-10T09:22:21.000Z (10 months ago)
- Last Synced: 2025-02-28T07:09:52.667Z (3 months ago)
- Topics: dart, dart-ffi, flutter, rust
- Language: C
- Homepage:
- Size: 537 KB
- Stars: 7
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# dart-sys
[](https://crates.io/crates/dart-sdk-sys)
[](https://docs.rs/crate/dart-sdk-sys/)
[](https://github.com/DoumanAsh/dart-sys/actions?query=workflow%3ARust)Bindings to dart FFI.
Crate version corresponds to Dart SDK [release](https://github.com/dart-lang/sdk/releases)
## Use cases
### General requirements
- Build your rust code as `cdylib` lib
### Flutter application
- When building for mobile device, you need to build with correct target (i.e. for `android-arm64` your rust target must be `aarch64-linux-android`)
- Place rust library into `android/app/src/main/jniLibs` accordingly to your target (i.e. for `android-arm64` you need to place it inside `arm64-v8a`)
- Build flutter application;
- Refer to `Dart application` for next steps. Flutter embeds your library inside APK so you can refer to it by just library full name.
### Dart application
- Dart FFI provides API to load C shared libraries: `ffi.DynamicLibrary.open()`;
- Once library successfully loaded, returned object can be used to lookup function pointers.
Given following rust function:
```rust
#[no_mangle]
pub unsafe extern "C" fn handle(rd: *const c_char) -> i8 {
//Do something
return 0;
}
```You can access its pointer in following way
```dart
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);
typedef DartFunctionT = int Function(ffi.Pointer);final d = ffi.DynamicLibrary.open("my_shared_lib_name.so");
final DartFunctionT sendDataToRust = d.lookupFunction("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);
}```
## How-to update to new SDK version
1. Update `version` in `Cargo.toml` to be equal to desired version of SDK
2. Run `cargo build --features download-sources,build-bindings`
3. Optionally run `rustfmt src/lib.rs` to make it pretty4. Commit and publish