2026'da C/C++ ile Android Uygulama Geliştirme

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

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

  1. 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.
  1. 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")
    }
  }
}
  1. 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") } }
}
  1. 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.