CodeBlanks Logo Icon CodeBlanks

FFI

dart:ffi ile native entegrasyon yazarsın.

FFI

dart:ffi, Dart kodunun C tabanlı native kütüphaneleri çağırmasını sağlar. Bir DynamicLibrary yüklenir, lookupFunction ile sembol bulunur, typedef'lerle Dart ve native imzalar eşleştirilir.

İki typedef: NativeAdd = Int32 Function(Int32, Int32) (native imza) ve DartAdd = int Function(int, int) (Dart imza). lookupFunction<NativeAdd, DartAdd>('native_add') ikisini bağlar.

Bu derste NativeMathService implements MathService tanımlayacağız. add metodu native çağrıyı sarar; describe metodu bağlama adını döndürür. Gerçek native çağrı için bir .so/.dll gerekir; burada simüle edilmiş bir uygulama yazacağız.

Native ve Dart imzaları

FFI'da her native fonksiyon için iki typedef gerekir: native taraf Int32, Pointer gibi türler kullanır; Dart taraf int, double kullanır.

Örnek: typedef NativeAdd = Int32 Function(Int32 a, Int32 b); ve typedef DartAdd = int Function(int a, int b);. lookupFunction<NativeAdd, DartAdd> bunları eşleştirir.

Bu derste add metodunu simüle ederek a + b dönecek şekilde yazacağız. Gerçek bir projede bu, lookupFunction'dan dönen fonksiyonu çağırırdı. Sözleşme aynı kalır.

Uygulama NativeMathService ekle

Aşağıdaki kodda MathService zaten tanımlı. Şimdi import 'dart:ffi'; ekle. typedef NativeAdd = Int32 Function(Int32 a, Int32 b); ve typedef DartAdd = int Function(int a, int b); tanımla. class NativeMathService implements MathService tanımla: final String bindingName; NativeMathService(this.bindingName); @override int add(int a, int b) => a + b; String describe() => 'native: $bindingName';. main içinde final svc = NativeMathService('native_add'); yarat; print(svc.describe()); ve print('sonuç: ${svc.add(2, 3)}'); ekle.

Başlangıç kodu

main.dart
abstract class MathService {
  int add(int a, int b);
}

// dart:ffi import ekle; NativeAdd ve DartAdd typedef'leri tanımla
// NativeMathService sınıfını tanımla (MathService arayüzünü uygular)

void main() {
  print('servis hazır');
  // bir NativeMathService yarat; describe ve add(2,3) yazdır
}

Örnek çözüm

main.dart
import 'dart:ffi';

abstract class MathService {
  int add(int a, int b);
}

typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);

class NativeMathService implements MathService {
  final String bindingName;
  NativeMathService(this.bindingName);
  @override
  int add(int a, int b) => a + b;
  String describe() => 'native: $bindingName';
}

void main() {
  print('servis hazır');
  final svc = NativeMathService('native_add');
  print(svc.describe());
  print('sonuç: ${svc.add(2, 3)}');
}

Beklenen çıktı

servis hazır
native: native_add
sonuç: 5

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Arayüz uygulama

Soru
class NativeMathService ____ MathService { }
Cevap
class NativeMathService implements MathService { }

Açıklama: implements ile MathService arayüzü uygulanır.

2 dart:ffi ile ne yapılır?

  • Native C fonksiyon çağırma Doğru cevap
  • JSON serileştirme
  • HTTP istekleri
  • Dosya okuma

Açıklama: dart:ffi native C fonksiyonlarını çağırır.

3 FFI parçalarını eşleştir

Kavram Anlamı
dart:ffi Native bağlama
DynamicLibrary Kütüphane yükleyici
lookupFunction Sembol arama
Int32 Native tam sayı

Uzman bölümündeki tüm dersler