0Pricing
Kotlin Academy · Ders

cinterop ve .def Dosyalarıyla C Birlikte Çalışabilirliği

cinterop aracını ve tanım dosyalarını kullanarak Kotlin/Native'den C kütüphanelerini çağırın.

cinterop ve .def Dosyalarıyla C Birlikte Çalışabilirliği, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

C Birlikte Çalışabilirliği Neden Gerekli

Kotlin/Native, C kitaplıklarını doğrudan çağırabilir; JNI sarmalayıcılarına veya köprüleme katmanına gerek yoktur. Bu sayede platform sistem kitaplıklarını, donanım sürücülerini veya C uyumlu herhangi bir kitaplığı yerel ikili dosyalara derlenen Kotlin kodundan kullanabilirsiniz.

.def Dosyası

Bir .def dosyası, içe aktarılacak C kitaplığını tanımlar. Üstbilgileri, kitaplık adını ve isteğe bağlı derleyici/bağlayıcı seçeneklerini belirtir. Dosyayı src/nativeInterop/cinterop/ içine yerleştirin:

# src/nativeInterop/cinterop/libcurl.def
headers = curl/curl.h
headerFilter = curl/**
linkerOpts.linux = -lcurl
linkerOpts.macos = -lcurl

Birlikte Çalışabilirliği Gradle'de Kaydetme

.def dosyasına hedefin compilations bloğunda başvurun:

kotlin {
    linuxX64 {
        compilations["main"].cinterops {
            val libcurl by creating {
                defFile(project.file("src/nativeInterop/cinterop/libcurl.def"))
            }
        }
    }
}

cinterop'u çalıştırma

C başlıklarından bir .klib oluşturmak için ./gradlew cinteropLibcurlLinuxX64 komutunu çalıştırın. Oluşturulan Kotlin bağlantıları build/cinterop/ içinde görünür ve derleme sınıf yoluna otomatik olarak eklenir.

Kotlin'de C işlevlerini kullanma

Oluşturma işleminden sonra .def dosyasında tanımlanan paketi içe aktarın ve C işlevlerini Kotlin işlevleri olarak çağırın. İşaretçi türleri CPointer ile gösterilir:

import libcurl.*
import kotlinx.cinterop.*

fun fetchUrl(url: String): String = memScoped {
    val handle = curl_easy_init() ?: error("curl init failed")
    curl_easy_setopt(handle, CURLOPT_URL, url.cstr.ptr)
    curl_easy_perform(handle)
    curl_easy_cleanup(handle)
    "done"
}

memScoped: yığın üzerinde ayrılan bellek

memScoped { }, yerel bellek ayırmalarının (alloc(), allocArray()) bloktan çıkıldığında otomatik olarak serbest bırakıldığı bir bellek kapsamı oluşturur. Bellek sızıntılarını önlemek için geçici C belleğinde her zaman bunu kullanın.

memScoped {
    val value = alloc<IntVar>()
    value.value = 42
    println(value.value)  // 42
    // freed automatically at end of memScoped
}

C için Kotlin nesnelerini sabitleme

Bir Kotlin nesnesinin adresini bir C işlevine (örneğin bir geri çağırmaya) geçirmek için, çöp toplayıcının nesneyi taşımasını önlemek üzere nesneyi StableRef veya Pinned ile sabitleyin:

val stableRef = StableRef.create(myKotlinObject)
try {
    c_function_expecting_user_data(stableRef.asCPointer())
} finally {
    stableRef.dispose()
}

C dizeleri ve Kotlin dizeleri

Kotlin String ile C const char* arasında şu yöntemleri kullanarak dönüşüm yapın:

  • "hello".cstr → CValues; memScoped içinde geçerlidir
  • cPointer.toKString() → CPointer<ByteVar> türündeki bir işaretçiden Kotlin String'i
memScoped {
    val cStr = "Hello, C!".cstr.ptr   // CPointer<ByteVar>
    val back = cStr.toKString()         // "Hello, C!"
}

Yapı alanlarına erişim

C yapıları, özelliklere sahip Kotlin sınıflarına dönüşür. Yapı alanlarına nokta işlecini kullanarak erişin. Yapıları bir memScoped { } içinde alloc() ile ayırın:

memScoped {
    val addr = alloc<sockaddr_in>()
    addr.sin_family = AF_INET.convert()
    addr.sin_port = htons(8080u).convert()
}

Satır içi C kodu ekleme

Kısa C parçacıkları için .def dosyasındaki cCode bloğunu kullanarak bağlantıyla birlikte derlenen satır içi C kodunu yazın:

# In .def file
headers = stdio.h
---
// Inline C code after ---
static inline int add(int a, int b) { return a + b; }

C birlikte çalışabilirliği sorunlarında hata ayıklama

Yaygın sorunlar: eksik başlıklar (headerFilter değerini denetleyin), eksik bağlayıcı seçenekleri (linkerOpts ekleyin), uyuşmayan türler (oluşturulan .klib API'sini denetleyin). Def dosyasında veya Gradle görevi yapılandırmasında -verbose kullanarak ayrıntılı cinterop çıktısını etkinleştirin.

Kısa kontrol

Kotlin/Native C birlikte çalışabilirliğinde memScoped { } kullanmanın amacı nedir?

Özet: cinterop ve .def dosyalarıyla C birlikte çalışabilirliği

Önemli çıkarımlar:

  • .def dosyası başlıkları, bağlayıcı seçeneklerini ve isteğe bağlı satır içi C kodunu belirtir
  • Gradle'a cinterops { val name by creating { defFile(...) } } aracılığıyla kaydedin
  • Bağlantıları oluşturmak için cinterop<Name><Target> Gradle görevini çalıştırın
  • Geçici yerel bellek ayırmaları için memScoped { } kullanın
  • Uzun ömürlü nesneleri StableRef ile sabitleyin; dizeleri .cstr / .toKString() ile dönüştürün

Sıkça Sorulan Sorular

“cinterop ve .def Dosyalarıyla C Birlikte Çalışabilirliği” dersi ücretsiz mi?

Evet — “cinterop ve .def Dosyalarıyla C Birlikte Çalışabilirliği” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“cinterop ve .def Dosyalarıyla C Birlikte Çalışabilirliği” dersinde ne öğreneceğim?

cinterop aracını ve tanım dosyalarını kullanarak Kotlin/Native'den C kütüphanelerini çağırın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“cinterop ve .def Dosyalarıyla C Birlikte Çalışabilirliği” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Kotlin/Native'e Genel Bakış: Hedefler, Araç Zinciri ve Derleme
  2. Kotlin/Native'de Bellek Yönetimi: Yeni MM
  3. cinterop ve .def Dosyalarıyla C Birlikte Çalışabilirliği
  4. Kotlin/WASM: Tarayıcı için WebAssembly'ye Derleme
← Kotlin Academy Sayfasına Dön