Bindings to dart FFI.
Crate version corresponds to Dart SDK release
cdylib
libWhen 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 FFI provides API to load C shared libraries: ffi.DynamicLibrary.open(<path to shared library>)
;
Once library successfully loaded, returned object can be used to lookup function pointers.
Given following rust function:
```rust
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
final d = ffi.DynamicLibrary.open("mysharedlib_name.so");
final DartFunctionT sendDataToRust = d.lookupFunction
/// 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); }
```
version
in Cargo.toml
to be equal to desired version of SDKcargo build --features download-sources,build-bindings
Optionally run rustfmt src/lib.rs
to make it pretty
Commit and publish