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 = -lcurlRejestrowanie 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ątrzmemScopedcPointer.toKString()→ String Kotlin na podstawieCPointer<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
.defokreś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
- Kotlin/Native — omówienie: cele, toolchain i kompilacja
- Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci
- Interoperacyjność z C za pomocą cinterop i plików .def
- Kotlin/WASM: kompilowanie do WebAssembly dla przeglądarki