Android Native Nedir ve Ne Zaman Kullanılmalı

Kerem Aydın·7 Temmuz 2026·⏱3 dk

Android Native; maksimum performans, düşük gecikme süresi veya mevcut native kodun yeniden kullanımı gerektiren görevler için Android NDK ve JNI aracılığıyla C/C++ ile geliştirmedir. Darboğazın CPU/GPU/bellek olduğu durumlarda (oyunlar, video işleme, kriptografi, gerçek zamanlı uygulamalar, karmaşık kütüphaneler) native geliştirmeyi tercih edin.

Nasıl Çalışır ve Temel Prensipler

Native kod, belirli bir ABI (arm64-v8a, armeabi-v7a, x86 vb.) için makine dilinde derlenir ve JVM'yi atlar; bu nedenle hız ve kaynak kontrolü daha yüksektir. Uygulamanın geri kalanıyla bağlantı JNI üzerinden kurulur: ağır algoritmalar C++ ile yazılırken, arayüz ve UI Kotlin/Java'da kalır. NDK, mevcut C/C++ kütüphanelerini (FFmpeg, OpenCV, Eigen) kullanmanıza ve düşük seviyeli API'lerle (Vulkan, OpenGL ES) çalışmanıza olanak tanır.

Native Ne Zaman Seçilmeli — Pratik Kriterler ve Örnekler

Aşağıdaki koşullardan en az biri doğruysa native yolunu seçin:

  • Grafikte veya render işleminde kararlı 60+ FPS gerekir (AAA oyunlar, 3D motorları).
  • Gerçek zamanlı video/ses işleme (kodekler, yayınlar, düzenleme).
  • Düşük gecikme gereksinimi olan karmaşık sayısal hesaplamalar/ML çıkarımı.
  • Büyük miktarda C/C++ kodunun yeniden kullanılması ihtiyacı (legacy kodlar, çapraz platformlu motorlar).
  • Bellek ve pil tüketimi konusunda katı kısıtlamalar (gömülü sistemler, IoT).

Alternatif örnekler:

  • MVP veya UI odaklı bir uygulama: Kotlin/Compose, Flutter — geliştirmede daha hızlıdır.
  • Sadece tek bir "kritik" fonksiyon yavaşlıyorsa, onu native modüle taşıyın, geri kalanını Kotlin'de bırakın.

Geçiş yapmadan önce uygulamanızı profilleyin: native koda yalnızca gerçekten doğrulanmış darboğaz modüllerini taşıyın.

Native'i "prestij" için kullanmayın. Destek, çapraz-ABI derlemeleri ve hata ayıklama geliştirme sürelerini uzatacaktır.

Nasıl Başlanır: Minimal Çalışma Planı

  1. Android Studio ve NDK'yı (hedef Android sürümünüzle uyumlu olanı) kurun.
  2. build.gradle dosyasında ndk/abiFilters belirtin ve CMake/ndkBuild'i bağlayın: android { defaultConfig { ndk { abiFilters "arm64-v8a", "armeabi-v7a" } } externalNativeBuild { cmake { path "CMakeLists.txt" } } }
  3. Basit bir JNI fonksiyonu oluşturun (C++): extern "C" JNIEXPORT jstring JNICALL Java_com_example_MainActivity_stringFromJNI(JNIEnv* env, jobject) { return env->NewStringUTF("Native OK"); } Kotlin'de: external fun stringFromJNI(): String
  4. Derleme: ./gradlew assembleDebug (veya Studio üzerinden). Farklı ABI'lere sahip gerçek cihazlarda test edin.
  5. Profilleyin (Android Profiler, systrace) ve enerji tüketimini kontrol edin.

Pratik tavsiyeler:

  • Yalnızca dar kapsamlı görevler için ayrı modüller (.so) oluşturun.
  • Her gerekli ABI için CI derlemelerini destekleyin.
  • JNI sözleşmesinin sınırlarını ve yönetilen belleği belgeleyin (sızıntılardan kaçının).

Sık Yapılan Hatalar

  • Yalnızca tek bir ABI derleyip uygulamanın tüm cihazlarda çalışacağını beklemek.
  • Büyük C/C++ kütüphanelerini Strip/Optimizasyon olmadan kopyalamak → APK şişmesi.
  • Güvenlik kontrollerini ihmal etmek: native kod daha karmaşıktır ancak bellek yönetiminde daha fazla hata riski taşır.
  • Farklı çekirdek ve GPU'lara sahip gerçek cihazlarda yetersiz test yapmak.

SSS

  • Tüm projeyi C++'a çevirmek gerekir mi? Hayır. Genellikle sadece "kritik" bölümleri taşımak yeterlidir.
  • Native APK boyutunu küçültür mü? Dar kapsamlı kütüphaneler için bazen evet, ancak genellikle her ABI için .so ekler — ABI bazlı splits'i kontrol edin.
  • Kod daha güvenli hale gelir mi? Decompile edilmesi daha zordur, ancak native koddaki güvenlik açıkları (buffer overflow) kritiktir — güvenlik dikkat gerektirir.
  • Hangisi daha hızlı: Kotlin + optimizasyon mu yoksa native C++ mı? Birçok görev için Kotlin yeterlidir; C++, hesaplama açısından ağır döngüler ve GPU ile düşük seviyeli çalışma için avantaj sağlar.