2026'da C/C++ ile Android Uygulama Geliştirme
Kısa cevap: 2026 yılında yüksek performanslı modüller için NDK r27+ (compileSdk 36) ve Gradle + CMake kombinasyonu kullanılır; C++'a alternatif olarak cargo-ndk aracılığıyla Rust tercih edilebilir. Aşağıda Kotlin/Compose içinde yerel kod çalıştırmak için pratik kurulum, örnek ve öneriler yer almaktadır.
NDK'nın SDK ile Hızlı Kurulumu ve Entegrasyonu
- NDK ve araçları yükleyin:
- sdkmanager "ndk;27.0.12077973"
- Android Gradle Plugin ve Gradle 8.7+ sürümüne sahip olduğunuzdan emin olun.
- app modülünde (build.gradle.kts) şunları belirtin:
android {
compileSdk = 36
ndkVersion = "27.0.12077973"
externalNativeBuild {
cmake {
path = "src/main/cpp/CMakeLists.txt"
version = "3.28"
}
}
defaultConfig {
externalNativeBuild {
cmake { cppFlags = "-std=c++17" }
}
ndk {
abiFilters += listOf("arm64-v8a","armeabi-v7a","x86_64")
}
}
}
- Basit bir C++ JNI fonksiyonu (src/main/cpp/native-lib.cpp):
#include <jni.h>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapp_MainActivity_stringFromJNI(JNIEnv* env, jobject) {
return env->NewStringUTF("Hello from C++ NDK 2026!");
}
Kotlin:
class MainActivity : ComponentActivity() {
private external fun stringFromJNI(): String
companion object { init { System.loadLibrary("native-lib") } }
}
- Derleme: ./gradlew assembleDebug — belirtilen ABI'ler için APK içine libnative-lib.so eklenecektir.
Güvenlik açısından daha sağlam bir mantık planlıyorsanız, cargo-ndk aracılığıyla Rust'ı değerlendirin: bu yaklaşım .so dosyaları oluşturur ve bellek hataları riskini azaltır.
Proje Örneği: Compose İçinde OpenGL İşleyici
Yapı: app/src/main/cpp/{CMakeLists.txt, gl-renderer.cpp, gl-renderer.h} Temel adımlar:
- CMake: GLESv3 ve log kütüphanelerini bağlayın.
cmake_minimum_required(VERSION 3.28)
add_library(gl-renderer SHARED gl-renderer.cpp)
find_library(log-lib log)
target_link_libraries(gl-renderer ${log-lib} GLESv3 EGL)
- gl-renderer.cpp içinde init(width,height) ve drawFrame() JNI yöntemlerini uygulayın.
- Kotlin tarafında Compose içinde render işlemi için AndroidView/GlSurfaceView veya NativeComposeInterop kullanın; yerel init/draw çağrıları için yaşam döngüsüne bağlı bir hook oluşturun.
Gerçek optimizasyonlar: önceden derlenmiş shader'lar kullanın, VBO/VAO tercih edin, durum geçişlerini en aza indirin ve GPU'yu profilleyin.
UI iş parçacığı içinde senkronizasyon olmadan std::thread oluşturmayın. JNI çağrıları için korutinler, HandlerThread veya yerel görev kuyruklarını tercih edin.
C++ ve Rust Karşılaştırması (Ne Zaman Hangisi Seçilmeli)
- C++: Maksimum ekosistem desteği (oyunlar, mevcut kod tabanı), LLVM optimizasyonları.
- Rust: Neredeyse aynı performans, çok daha yüksek bellek güvenliği — yeni ML uygulamaları ve kritik modüller için uygundur.
- Seçim kriteri: Legacy/Unity/Unreal taşımaları için C++; yeni kritik mantık için Rust.
Sık Yapılan Hatalar
- Gradle içinde yanlış ndkVersion → derleme farklı bir NDK kullanır.
- System.loadLibrary(...) unutulması veya kütüphane adının uyuşmaması.
- Yanlış abiFilters ayarlanması — APK içinde gerekli .so dosyaları eksik kalır.
- UI içinde senkronizasyon olmadan blocking IO/iş parçacıkları kullanımı → ANR/çökmeler.
- compileSdk ve kullanılan özelliklerin uyumsuzluğu (Compose NativeInterop için compileSdk 36+ gerekir).
SSS
- Basit uygulamalar için NDK kullanmak gerekir mi? Hayır — yalnızca performans açısından kritik modüller için gereklidir.
- Yerel kod nasıl test edilir? Android Studio Profiler + perfetto ve donanım profilleme araçlarını kullanın; emülatör faydalıdır ancak gerekli mimariye sahip gerçek cihazlarda test yapın.
- Aynı modül içinde C++ ve Rust karıştırılabilir mi? Evet — Rust, C ABI dışa aktarabilir ve ardından C++/JNI üzerinden bağlanabilir.
En iyi uygulamalar: CPU/GPU profilleme yapın, Java/Kotlin ve yerel kod arasındaki geçişleri en aza indirin, kritik yerel bölümleri testlerle kapsayın ve derlemeyi AGP + CMake/cargo-ndk ile otomatikleştirin.