0Pricing
Kotlin Academy · Lekcja

Interoperacyjność z C za pomocą cinterop i plików .def

Wywołuj biblioteki C z Kotlin/Native za pomocą narzędzia cinterop i plików definicji.

Interoperacyjność z C za pomocą cinterop i plików .def to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Dlaczego współdziałanie z C?

Kotlin/Native może bezpośrednio wywoływać biblioteki C — bez opakowań JNI i warstwy pośredniczącej. Umożliwia to korzystanie z systemowych bibliotek platformy, sterowników sprzętowych oraz dowolnej biblioteki zgodnej z C z poziomu kodu Kotlinu skompilowanego do natywnych plików binarnych.

Plik .def

Plik .def opisuje importowaną bibliotekę C. Określa nagłówki, nazwę biblioteki oraz opcjonalne flagi kompilatora i linkera. Umieść go w katalogu src/nativeInterop/cinterop/:

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

Rejestrowanie współdziałania w Gradle

Odwołaj się do pliku .def w bloku compilations platformy docelowej:

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

Uruchamianie cinterop

Uruchom ./gradlew cinteropLibcurlLinuxX64, aby wygenerować plik .klib na podstawie nagłówków C. Wygenerowane bindingi Kotlin pojawią się w katalogu build/cinterop/ i zostaną automatycznie dodane do ścieżki klas kompilacji.

Używanie funkcji C w Kotlinie

Po wygenerowaniu zaimportuj pakiet zadeklarowany w pliku .def i wywołuj funkcje C jak funkcje Kotlin. Typy wskaźnikowe są reprezentowane jako CPointer:

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: Pamięć alokowana na stosie

memScoped { } tworzy zakres pamięci, w którym alokacje natywne (alloc(), allocArray()) są automatycznie zwalniane po zakończeniu bloku. Należy zawsze używać tego mechanizmu w przypadku tymczasowej pamięci C, aby uniknąć wycieków.

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

Przypinanie obiektów Kotlin dla C

Aby przekazać adres obiektu Kotlin do funkcji C (np. jako callback), przypnij go za pomocą StableRef lub Pinned, aby zapobiec przeniesieniu obiektu przez GC:

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

Łańcuchy znaków C i Kotlin

Konwertuj między String w Kotlinie a const char* w C za pomocą:

  • "hello".cstr → CValues, ważne wewnątrz memScoped
  • cPointer.toKString() → String Kotlin na podstawie CPointer<ByteVar>
memScoped {
    val cStr = "Hello, C!".cstr.ptr   // CPointer<ByteVar>
    val back = cStr.toKString()         // "Hello, C!"
}

Dostęp do struktur

Struktury C stają się klasami Kotlin z właściwościami. Dostęp do pól struktury uzyskuje się za pomocą operatora kropki. Struktury należy alokować za pomocą alloc() wewnątrz memScoped { }:

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

Osadzanie kodu C w linii

W przypadku krótkich fragmentów C użyj bloku cCode w pliku .def, aby zapisać kod C wbudowany w plik, który zostanie skompilowany razem z bindingiem:

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

Debugowanie problemów z interoperacyjnością C

Typowe problemy to: brakujące nagłówki (sprawdź headerFilter), brakujące flagi konsolidatora (dodaj linkerOpts) oraz niezgodne typy (sprawdź API wygenerowanego pliku .klib). Włącz szczegółowe logowanie cinterop, używając -verbose w pliku def lub konfiguracji zadania Gradle.

Szybkie sprawdzenie

Jaki jest cel użycia memScoped { } w interoperacyjności Kotlin/Native z C?

Podsumowanie: interoperacyjność C z cinterop i plikami .def

Najważniejsze informacje:

  • Plik .def określa nagłówki, opcje konsolidatora i opcjonalny wbudowany kod C
  • Rejestracja w Gradle odbywa się za pomocą cinterops { val name by creating { defFile(...) } }
  • Uruchom zadanie Gradle cinterop<Name><Target>, aby wygenerować bindingi
  • Używaj memScoped { } do tymczasowych alokacji natywnych
  • Przypinaj obiekty używane przez dłuższy czas za pomocą StableRef; konwertuj napisy za pomocą .cstr / .toKString()

Często zadawane pytania

Czy lekcja „Interoperacyjność z C za pomocą cinterop i plików .def” jest bezpłatna?

Tak — pełny tekst „Interoperacyjność z C za pomocą cinterop i plików .def” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Interoperacyjność z C za pomocą cinterop i plików .def”?

Wywołuj biblioteki C z Kotlin/Native za pomocą narzędzia cinterop i plików definicji. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Interoperacyjność z C za pomocą cinterop i plików .def”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kotlin/Native — omówienie: cele, toolchain i kompilacja
  2. Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci
  3. Interoperacyjność z C za pomocą cinterop i plików .def
  4. Kotlin/WASM: kompilowanie do WebAssembly dla przeglądarki
← Powrót do Kotlin Academy