Skip to main content

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 add do 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.