Android Native Nedir ve Ne Zaman Kullanılmalı
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ı
- Android Studio ve NDK'yı (hedef Android sürümünüzle uyumlu olanı) kurun.
- 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" } } }
- 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
- Derleme: ./gradlew assembleDebug (veya Studio üzerinden). Farklı ABI'lere sahip gerçek cihazlarda test edin.
- 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.