Сегодня расскажу про dart:ffi — интерфейс для вызова нативного кода (C/C++) напрямую из Dart.
Зачем нужен dart:ffi
Обычно для связи Flutter с нативом мы используем MethodChannel. Но бывают задачи, где этот способ слишком громоздкий или недостаточно быстрый. В таких случаях выручает dart:ffi:
✔️доступ к системным API напрямую
✔️использование готовых библиотек на C (SQLite, OpenSSL, TensorFlow Lite и других)
✔️оптимизация производительности тяжелых вычислений
Как это работает
▫️Dart связывается с C через указатели и структуры
▫️Нужные функции подключаются через DynamicLibrary.open()
▫️Типы приходится преобразовывать: Dart ⇄ C
Пример: подключаем простую C-функцию
C-библиотека math.c:
C
// math.c
int sum(int a, int b) {
return a + b;
}
Компиляция в динамическую библиотеку:
▪️Linux/Mac: gcc -shared -o libmath.so math.c
▪️Windows: gcc -shared -o math.dll math.c
Dart-код (main.dart):
import 'dart:ffi';
import 'dart:io';
// Загружаем библиотеку
final dylib = Platform.isWindows
? DynamicLibrary.open("math.dll")
: DynamicLibrary.open("libmath.so");
// Сигнатура функции C
typedef c_sum_func = Int32 Function(Int32, Int32);
typedef dart_sum_func = int Function(int, int);
// Получаем функцию
final sum = dylib.lookupFunction<c_sum_func, dart_sum_func>('sum');
void main() {
print(sum(3, 4)); // 7
}
Основные типы FFI
▪️ Int8, Int16, Int32, Int64 ↔ int
▪️ Float, Double ↔ double
▪️ Pointer<T> — указатель на C-объект
▪️ Struct — структуры данных
Когда использовать
✅ Использовать:
▫️подключение нативных библиотек (sqlite3, opus, zlib)
▫️задачи производительности (машинное обучение, криптография)
▫️системные API iOS/Android
❌ Не использовать:
▫️в обычных Flutter-приложениях (чаще достаточно MethodChannel)
▫️если задачу можно решить чистым Dart или готовым пакетом
❤️ — если было полезно
