Dart
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.
Örnek çözümü göster
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)}');
}
Kendini test et
-
Arayüz uygulama
class NativeMathService ____ MathService { }
Cevabı göster
class NativeMathService implements MathService { }
-
dart:ffi ile ne yapılır?
- Native C fonksiyon çağırma
- JSON serileştirme
- HTTP istekleri
- Dosya okuma
Cevabı göster
Native C fonksiyon çağırma — dart:ffi native C fonksiyonlarını çağırır.
-
FFI parçalarını eşleştir
- dart:ffi
- Native bağlama
- DynamicLibrary
- Kütüphane yükleyici
- lookupFunction
- Sembol arama
- Int32
- Native tam sayı
Sıradaki ders: Codegen