Это позволяет ускорить некоторые сложные вычисления. При этом использование FFI, даже с интерфейсом, получается быстрее, чем вычисление на чистом дарте. Также некоторые библиотеки изначально написаны на C, и переписывание их на Dart будет дополнительной работой, требующей знания как и C, так и Dart.
В самом начале нам нужно получить собранную библиотеку - файл DLL. Для разных операционных систем он будет разным. Для Windows -
.dll, для macOS - .dylib, для мобильных ОС - .so. Его можно создать при помощи CMake.Для использования FFI нам нужно добавить 3 библиотеки - сам
dart:ffi, dart:io для работы с платформой и нахождения наших файлов и path для помощи в этом.Для подключения библиотеки C необходимо объявить сигнатуру функции на языке С:
typedef calculator_func = Int32 Function(Int32 a, Int32 b);
Int32 является нативным типом.Объявим также тип для функции на языке Dart
typedef Calculator = int Function(int a, int b);
Загрузим библиотеку:
final dylib = ffi.DynamicLibrary.open(...);
final Calculator function = dylib
.lookup<NativeFunction<calculator_func>>(...)
.asFunction();
И теперь мы можем вызвать эту функцию:
print(function(7, 3));
Следует также учитывать, что в FFI нет типа
String, и придется использовать Array<UInt32> для трансляции строки в Unicode.Для веб-приложений существует возможность использовать JS interop, которая позволяет использовать внешние JavaScript библиотеки в веб-приложении. И для этого уже существуют разработанные решения, например, пакет web.
Также существуют Java/Kotlin и Objective C/Swift интеропы, но эти фичи экспериментальны. Еще можно использовать Platform Channel для взаимодействия с нативным кодом.
А вы пробовали работать с Dart FFI на своих проектах? Делитесь в чате.
