Meydan okuma 2
- Flutter kursu
- Uzman seviye
- Ders 37/39
- 3 dk
dart:ffi ile C kütüphanesinden matematik çağrısı yaparsın.
dart:ffi ile C çağrısı
dart:ffi, Dart'tan doğrudan C kütüphanelerini çağırmana izin verir. DynamicLibrary.process() ile işlemdeki sembolleri açarsın; lookupFunction ile bir C fonksiyonunu Dart fonksiyonuna sarmalarsın. İki typedef gerekir: yerel imza ve Dart imzası.
typedef SqrtNative = Double Function(Double);
typedef SqrtDart = double Function(double);
final lib = DynamicLibrary.process();
final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
print(sqrt(9)); // 3.0Uygulama sqrt çağrısı
SqrtNative ve SqrtDart typedef'lerini tanımla. DynamicLibrary.process() ile kütüphaneyi aç. lookupFunction ile sqrt fonksiyonunu al. main içinde karekök fonksiyonunu 9 ile çağır ve sonucu yazdır.
Başlangıç kodu
import 'dart:ffi';
// İki typedef tanımla: yerel ve Dart imzası
// Kütüphaneyi aç
// karekök fonksiyonunu sarmala
// main: fonksiyonu 9 ile çağır ve yazdır
void main() {
}Örnek çözüm
import 'dart:ffi';
typedef SqrtNative = Double Function(Double);
typedef SqrtDart = double Function(double);
void main() {
final lib = DynamicLibrary.process();
final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
print(sqrt(9));
}Beklenen çıktı
3.0
Uygulama Hipotenüs hesapla
Aynı typedef'leri ve sqrt sarmalayıcıyı kullan. hypotenuse(double a, double b) fonksiyonu yaz: sqrt(a * a + b * b) döndürsün. main içinde hypotenuse(3, 4) sonucunu yazdır.
Başlangıç kodu
import 'dart:ffi';
// İki typedef: yerel ve Dart imzası
// Kütüphaneyi aç ve karekök fonksiyonunu sarmala
// hypotenuse(a, b) fonksiyonu yaz
// main: hipotenüs(3, 4) sonucunu yazdır
void main() {
}Örnek çözüm
import 'dart:ffi';
typedef SqrtNative = Double Function(Double);
typedef SqrtDart = double Function(double);
double hypotenuse(double a, double b) {
final lib = DynamicLibrary.process();
final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
return sqrt(a * a + b * b);
}
void main() {
print(hypotenuse(3, 4));
}Beklenen çıktı
5.0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 lookupFunction ne işe yarar?
- Platform kanalı açar
- C kütüphanesini derler
- Bellek yönetimi yapar
- C fonksiyonunu Dart fonksiyonuna sarmalar Doğru cevap
Açıklama: lookupFunction, bir C sembolünü arar ve güvenli Dart çağrısına sarmalar; iki typedef arasındaki dönüşümü yapar.
2 DynamicLibrary aç
final lib = ____;
final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
final lib = DynamicLibrary.process();
final sqrt = lib.lookupFunction<SqrtNative, SqrtDart>('sqrt');
Açıklama: DynamicLibrary.process() işlemdeki tüm sembolleri açar; sqrt gibi standart C fonksiyonlarına erişim sağlar.
3 FFI parçaları
| Kavram | Anlamı |
|---|---|
DynamicLibrary |
C kütüphanesini yükler |
lookupFunction |
C fonksiyonunu sarmalar |
Double |
FFI double tipi |
typedef |
Fonksiyon imza adı |