Bindings to dart FFI.
Crate version corresponds to Dart SDK release
- Build your rust code as
cdyliblib
-
When building for mobile device, you need to build with correct target (i.e. for
android-arm64your rust target must beaarch64-linux-android) -
Place rust library into
android/app/src/main/jniLibsaccordingly to your target (i.e. forandroid-arm64you need to place it insidearm64-v8a) -
Build flutter application;
-
Refer to
Dart applicationfor 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:
#[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
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);
}
-
Update
versioninCargo.tomlto be equal to desired version of SDK -
Run
cargo build --features download-sources,build-bindings -
Optionally run
rustfmt src/lib.rsto make it pretty -
Commit and publish