Interoperabilitas C dengan cinterop dan File .def
Panggil pustaka C dari Kotlin/Native menggunakan alat cinterop dan file definisi.
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 = -lcurlMendaftarkan 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 dalammemScopedcPointer.toKString()→ String Kotlin dariCPointer<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
.defmenentukan 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()
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
- Gambaran Umum Kotlin/Native: Target, Rantai Alat, dan Kompilasi
- Manajemen Memori di Kotlin/Native: MM Baru
- Interoperabilitas C dengan cinterop dan File .def
- Kotlin/WASM: Mengompilasi ke WebAssembly untuk Peramban