Kotlin Academy · Pelajaran

Interoperabilitas C dengan cinterop dan File .def

Panggil pustaka C dari Kotlin/Native menggunakan alat cinterop dan file definisi.

Pelajaran 3 dari 413 langkah

Interoperabilitas C dengan cinterop dan File .def adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Mengapa Interoperabilitas C?

Kotlin/Native dapat memanggil pustaka C secara langsung—tanpa pembungkus JNI dan tanpa lapisan penghubung. Hal ini memungkinkan penggunaan pustaka sistem platform, pengandar perangkat keras, atau pustaka apa pun yang kompatibel dengan C dari kode Kotlin yang dikompilasi menjadi biner native.

Berkas .def

Berkas .def menjelaskan pustaka C yang akan diimpor. Berkas ini menentukan header, nama pustaka, serta tanda kompilator/penghubung opsional. Letakkan berkas tersebut di src/nativeInterop/cinterop/:

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

Mendaftarkan Interoperabilitas di Gradle

Referensikan berkas .def dalam blok compilations milik target:

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

Menjalankan cinterop

Jalankan ./gradlew cinteropLibcurlLinuxX64 untuk menghasilkan .klib dari header C. Pengikatan Kotlin yang dihasilkan muncul di build/cinterop/ dan secara otomatis ditambahkan ke jalur kelas kompilasi.

Menggunakan Fungsi C di Kotlin

Setelah dibuat, impor paket yang dideklarasikan dalam berkas .def dan panggil fungsi C sebagai fungsi Kotlin. Tipe penunjuk direpresentasikan sebagai 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: Memori yang Dialokasikan di Tumpukan

memScoped { } membuat lingkup memori tempat alokasi asli (alloc(), allocArray()) dibebaskan secara otomatis saat blok selesai. Selalu gunakan ini untuk memori C sementara agar terhindar dari kebocoran.

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

Mengunci Objek Kotlin untuk C

Untuk meneruskan alamat objek Kotlin ke fungsi C (misalnya, callback), kunci objek tersebut dengan StableRef atau Pinned agar pengumpul sampah tidak memindahkannya:

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

String C dan String Kotlin

Konversikan antara String Kotlin dan const char* C menggunakan:

  • "hello".cstr → CValues, valid di dalam memScoped
  • cPointer.toKString() → String Kotlin dari CPointer<ByteVar>
memScoped {
    val cStr = "Hello, C!".cstr.ptr   // CPointer<ByteVar>
    val back = cStr.toKString()         // "Hello, C!"
}

Mengakses Struktur

Struktur C menjadi kelas Kotlin dengan properti. Akses bidang struktur menggunakan operator titik. Alokasikan struktur dengan alloc() di dalam memScoped { }:

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

Menyematkan Kode C inline

Untuk cuplikan C singkat, gunakan blok cCode dalam berkas .def untuk menulis kode C inline yang dikompilasi bersama pengikatan:

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

Menangani Masalah Interoperabilitas C

Masalah umum: header tidak ditemukan (periksa headerFilter), bendera penghubung tidak ditemukan (tambahkan linkerOpts), tipe tidak cocok (periksa API .klib yang dihasilkan). Aktifkan cinterop secara mendetail dengan -verbose dalam berkas def atau konfigurasi tugas Gradle.

Pemeriksaan Singkat

Apa tujuan memScoped { } dalam interoperabilitas C Kotlin/Native?

Ringkasan: Interoperabilitas C dengan Berkas cinterop dan .def

Poin penting:

  • Berkas .def menentukan header, opsi penghubung, dan C inline opsional
  • Daftarkan di Gradle melalui cinterops { val name by creating { defFile(...) } }
  • Jalankan tugas Gradle cinterop<Name><Target> untuk menghasilkan pengikatan
  • Gunakan memScoped { } untuk alokasi asli sementara
  • Kunci objek yang berumur panjang dengan StableRef; konversikan string dengan .cstr / .toKString()
Gratis untuk memulai

Belajar Kotlin dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Interoperabilitas C dengan cinterop dan File .def” gratis?

Ya — teks lengkap “Interoperabilitas C dengan cinterop dan File .def” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Interoperabilitas C dengan cinterop dan File .def”?

Panggil pustaka C dari Kotlin/Native menggunakan alat cinterop dan file definisi. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Interoperabilitas C dengan cinterop dan File .def” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Gambaran Umum Kotlin/Native: Target, Rantai Alat, dan Kompilasi
  2. Manajemen Memori di Kotlin/Native: MM Baru
  3. Interoperabilitas C dengan cinterop dan File .def
  4. Kotlin/WASM: Mengompilasi ke WebAssembly untuk Peramban
← Kembali ke Kotlin Academy