Kotlin'den C++ Fonksiyonu Çağırmak: JNI Rehberi
Güncellendi: 18 Ağustos 2026 · Okuma: 8 dakika
JNI (Java Native Interface), Kotlin/Java kodunun C/C++ ile yazılmış native fonksiyonları çağırmasını sağlayan köprüdür. Fonksiyonu Kotlin tarafında 'external' ile tanımlar, C++ tarafında JNI adlandırma kuralına uygun karşılığını yazarsınız.
İleri
Android (Kotlin ↔ C++ köprüsü)
1. JNI nedir?
JNI, JVM üzerinde çalışan kodun (Kotlin dahil) makine koduna derlenmiş native kütüphanelerle (.so dosyaları) haberleşmesini sağlayan standart bir arayüzdür. NDK ile derlediğiniz C++ kodu uygulamaya bu köprü üzerinden dahil olur.
2. Kotlin tarafı
class NativeLib {
external fun topla(a: Int, b: Int): Int
companion object {
init {
System.loadLibrary("native-lib")
}
}
}external, "bu fonksiyonun gövdesi native tarafta" demektir. System.loadLibrary ise derlenmiş kütüphaneyi belleğe yükler.
3. C++ tarafı
#include <jni.h>
extern "C" JNIEXPORT jint JNICALL
Java_com_ornek_NativeLib_topla(JNIEnv* env, jobject thiz, jint a, jint b) {
return a + b;
}Fonksiyon adı Java_<paket>_<sınıf>_<fonksiyon> kalıbına birebir uymak zorundadır. Buradaki en küçük yazım hatası, uygulama çalışırken UnsatisfiedLinkError almanıza yol açar.
4. Yaygın hatalar ve çözümleri
- UnsatisfiedLinkError: Fonksiyon imzası eşleşmiyor ya da kütüphane yüklenmemiş. Paket adını ve
loadLibraryçağrısını kontrol edin. - Referans sızıntısı: JNI üzerinden alınan yerel referanslar (local reference) serbest bırakılmazsa bellek sızar. Döngü içinde referans üretiyorsanız
DeleteLocalRefkullanın. - Thread güvenliği: Native tarafta açılan bir thread, başka thread'in
JNIEnvişaretçisini kullanamaz; her thread kendi ortamınıAttachCurrentThreadile almalıdır. - Aşırı köprü geçişi: Her JNI çağrısının bir maliyeti vardır. Döngü içinde binlerce kez çağırmak yerine, veriyi tek seferde dizi olarak geçirmek çok daha hızlıdır.
5. Gerçekten JNI'a ihtiyacınız var mı?
JNI güç verdiği kadar karmaşıklık da getirir. Basit veri işleme görevleri için Kotlin yazmak hem daha hızlı geliştirilir hem de daha az hataya açıktır. JNI'ı yalnızca ölçülmüş bir performans ihtiyacı olduğunda veya hazır bir C++ kütüphanesini kullanmak zorunda olduğunuzda tercih edin.