İçeriğe geç
Fundirod
Geliştirici

Kotlin'den C++ Fonksiyonu Çağırmak: JNI Rehberi

Güncellendi: 18 Ağustos 2026 · Okuma: 8 dakika

Kısa cevap

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.

Seviye

İleri

Platform

Android (Kotlin ↔ C++ köprüsü)

Ne tür uygulamalar yapılır?
Oyun motoru entegrasyonuNative kütüphane kullanımıPerformans optimizasyonu

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 DeleteLocalRef kullanın.
  • Thread güvenliği: Native tarafta açılan bir thread, başka thread'in JNIEnv işaretçisini kullanamaz; her thread kendi ortamını AttachCurrentThread ile 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.