Kotlin Academy · Lektion

C-Interop mit cinterop und .def-Dateien

Rufen Sie C-Bibliotheken aus Kotlin/Native mit dem cinterop-Tool und Definitionsdateien auf.

Lektion 3 von 413 Schritte

C-Interop mit cinterop und .def-Dateien ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum C-Interop?

Kotlin/Native kann C-Bibliotheken direkt aufrufen – ohne JNI-Wrapper und ohne Bridging-Schicht. So können Sie Plattform-Systembibliotheken, Hardwaretreiber oder jede C-kompatible Bibliothek aus Kotlin-Code verwenden, der in native Binärdateien kompiliert wird.

Die .def-Datei

Eine .def-Datei beschreibt die zu importierende C-Bibliothek. Sie legt Header, Bibliotheksnamen und optionale Compiler-/Linker-Flags fest. Legen Sie sie in src/nativeInterop/cinterop/ ab:

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

C-Interop in Gradle registrieren

Verweisen Sie im compilations-Block des Targets auf die .def-Datei:

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

cinterop ausführen

Führen Sie ./gradlew cinteropLibcurlLinuxX64 aus, um aus den C-Headern eine .klib zu generieren. Die generierten Kotlin-Bindings werden unter build/cinterop/ abgelegt und automatisch zum Klassenpfad der Kompilierung hinzugefügt.

C-Funktionen in Kotlin verwenden

Importieren Sie nach der Generierung das in der .def-Datei deklarierte Paket und rufen Sie C-Funktionen wie Kotlin-Funktionen auf. Zeigertypen werden als CPointer dargestellt:

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: Stack-allokierter Speicher

memScoped { } erstellt einen Speicherbereich, in dem native Allokationen (alloc(), allocArray()) beim Verlassen des Blocks automatisch freigegeben werden. Verwenden Sie ihn für temporären C-Speicher immer, um Speicherlecks zu vermeiden.

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

Kotlin-Objekte für C pinnen

Um die Adresse eines Kotlin-Objekts an eine C-Funktion zu übergeben (z. B. einen Callback), pinnen Sie es mit StableRef oder Pinned, damit der GC es nicht verschiebt:

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

C-Strings und Kotlin-Strings

Konvertieren Sie zwischen Kotlin-String und C-const char* mit:

  • "hello".cstr → CValues, innerhalb von memScoped gültig
  • cPointer.toKString() → Kotlin-String aus einem CPointer<ByteVar>
memScoped {
    val cStr = "Hello, C!".cstr.ptr   // CPointer<ByteVar>
    val back = cStr.toKString()         // "Hello, C!"
}

Zugriff auf Structs

C-Structs werden zu Kotlin-Klassen mit Properties. Greifen Sie mit dem Punktoperator auf Struct-Felder zu. Allokieren Sie Structs mit alloc() innerhalb von memScoped { }:

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

Inline-C-Code einbetten

Für kurze C-Codeausschnitte verwenden Sie den cCode-Block in der .def-Datei, um Inline-C-Code zu schreiben, der zusammen mit dem Binding kompiliert wird:

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

C-Interop-Probleme debuggen

Häufige Probleme sind fehlende Header (prüfen Sie headerFilter), fehlende Linker-Flags (fügen Sie linkerOpts hinzu) und nicht übereinstimmende Typen (prüfen Sie die generierte .klib-API). Aktivieren Sie ausführliches cinterop mit -verbose in der Def-Datei oder der Gradle-Task-Konfiguration.

Kurzer Test

Welchen Zweck erfüllt memScoped { } bei der C-Interop von Kotlin/Native?

Zusammenfassung: C-Interop mit cinterop und .def-Dateien

Wichtige Erkenntnisse:

  • Die .def-Datei legt Header, Linker-Optionen und optionalen Inline-C-Code fest
  • Registrieren Sie die Interop-Bibliothek in Gradle über cinterops { val name by creating { defFile(...) } }
  • Führen Sie den Gradle-Task cinterop<Name><Target> aus, um Bindings zu generieren
  • Verwenden Sie memScoped { } für temporäre native Allokationen
  • Pinnen Sie langlebige Objekte mit StableRef; konvertieren Sie Strings mit .cstr / .toKString()
Kostenlos starten

Lerne Kotlin mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
51
Lektionen
203

Häufig gestellte Fragen

Ist die Lektion „C-Interop mit cinterop und .def-Dateien“ kostenlos?

Ja — der vollständige Text von „C-Interop mit cinterop und .def-Dateien“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „C-Interop mit cinterop und .def-Dateien“?

Rufen Sie C-Bibliotheken aus Kotlin/Native mit dem cinterop-Tool und Definitionsdateien auf. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „C-Interop mit cinterop und .def-Dateien“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Kotlin/Native im Überblick: Ziele, Toolchain und Kompilierung
  2. Speicherverwaltung in Kotlin/Native: Der neue MM
  3. C-Interop mit cinterop und .def-Dateien
  4. Kotlin/WASM: Kompilieren für WebAssembly im Browser
← Zurück zu Kotlin Academy