FFI
🧩 O que é Dart FFI?
FFI (Foreign Function Interface) é um mecanismo que permite ao código Dart chamar diretamente funções de bibliotecas nativas escritas em linguagens como C, C++, Rust ou Go. Isso é feito sem a necessidade de serialização de dados, proporcionando uma comunicação mais rápida e eficiente entre Dart e código nativo.
🚀 Por que usar Dart FFI?
1. Melhoria de Desempenho
- Sem serialização: Diferente dos Platform Channels, o FFI evita a conversão de dados para formatos como JSON ou Protobuf, o que reduz a sobrecarga.
- Acesso direto à memória: Permite interações mais rápidas com funções nativas, ideal para operações que exigem alto desempenho.
2. Reutilização de Código Nativo Existente
- Bibliotecas C/C++: Integrar bibliotecas como OpenCV para processamento de imagens.
- Código Rust/Go: Utilizar funcionalidades espec íficas ou otimizadas já existentes nessas linguagens.
3. Evitar Platform Channels
- Menor latência: FFI elimina a necessidade de mensagens entre Dart e o código nativo, tornando as chamadas mais rápidas.
🛠️ Como funciona o Dart FFI?
1. Código Nativo (C)
// math_library.c
int add(int a, int b) {
return a + b;
}
Compile este código em uma biblioteca compartilhada:
- Windows:
.dll - Linux:
.so - macOS:
.dylib
2. Código Dart
import 'dart:ffi';
typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);
void main() {
final lib = DynamicLibrary.open('math_library.so'); // Altere conforme o sistema
final add = lib.lookupFunction<NativeAdd, DartAdd>('add');
print(add(3, 5)); // Saída: 8
}
Este código:
- Carrega a biblioteca nativa.
- Mapeia a função
adddo C para uma função Dart. - Chama a função como se fosse nativa do Dart.
⚠️ Considerações Importantes
- Não compatível com Web: O FFI não funciona em navegadores; para isso, utilize
package:js. - Gerenciamento de memória manual: Diferente do Dart, linguagens como C não possuem coleta de lixo automática, exigindo atenção ao alocar e liberar memória.
✅ Quando usar Dart FFI?
- Processamento intensivo: Tarefas como processamento de vídeo ou jogos que exigem alto desempenho.
- Integração com bibliotecas existentes: Quando há necessidade de utilizar bibliotecas nativas já desenvolvidas.
- Evitar overhead de Platform Channels: Para chamadas frequentes que se beneficiam de menor latência.
📌 Resumo
- FFI permite chamadas diretas de Dart para código nativo, como C ou Rust.
- Mais rápido que Platform Channels, pois evita serialização.
- Ideal para tarefas críticas de desempenho ou reutilização de código nativo existente.