Bindings to dart FFI.
Crate version corresponds to Dart SDK release
- Build your rust code as
cdylib
lib
-
When building for mobile device, you need to build with correct target (i.e. for
android-arm64
your rust target must beaarch64-linux-android
) -
Place rust library into
android/app/src/main/jniLibs
accordingly to your target (i.e. forandroid-arm64
you need to place it insidearm64-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:
#[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
version
inCargo.toml
to be equal to desired version of SDK -
Run
cargo build --features download-sources,build-bindings
-
Optionally run
rustfmt src/lib.rs
to make it pretty -
Commit and publish