FFI
- Dart kursu
- Uzman
- Ders 44/47
- 6 dk
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
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
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
class NativeMathService ____ MathService { }
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ı |