Kavramlar

Başlamadan önce

Bu kılavuzda, yerel programlama ve Android geliştirmedeki doğal olarak sahip olduğunuz kavramlara zaten aşina olduğunuz varsayılmaktadır.

Giriş

Bu bölümde, NDK'nın nasıl çalıştığıyla ilgili genel bir açıklama verilmiştir. Android NDK, Android uygulamalarınıza C veya C++ ("yerel kod") yerleştirmenize olanak tanıyan bir araç setidir. Android uygulamalarında yerel kod kullanma olanağı, aşağıdakilerden birini veya daha fazlasını yapmak isteyen geliştiriciler için özellikle yararlı olabilir:

  • Uygulamalarını platformlar arasında taşıyabilir.
  • Mevcut kitaplıkları yeniden kullanın veya yeniden kullanım için kendi kitaplıklarını sağlayın.
  • Belirli durumlarda, özellikle de oyunlar gibi işlemi yoğun olan oyunlarda performansı artırın.

Nasıl çalışır?

Bu bölümde Android için yerel bir uygulama oluştururken kullanılan ana bileşenler tanıtılmakta ve geliştirme ile paketleme süreci açıklanmaktadır.

Ana bileşenler

Uygulamanızı oluştururken aşağıdaki bileşenler hakkında bilgi sahibi olmanız gerekir:

  • Yerel paylaşılan kitaplıklar: NDK bu kitaplıkları veya .so dosyalarını C/C++ kaynak kodunuzdan oluşturur.

  • Yerel statik kitaplıklar: NDK, diğer kitaplıklara bağlayabileceğiniz statik kitaplıklar veya .a dosyaları da oluşturabilir.

  • Java Yerel Arayüzü (JNI): JNI, Java ve C++ bileşenlerinin birbirleriyle iletişim kurduğu arayüzdür. Bu kılavuz, JNI hakkında bilgi sahibi olduğunuzu varsayar. Bu konu hakkında bilgi edinmek için Java Yerel Arayüz Spesifikasyonu'na bakın.

  • Uygulama İkili Arabirimi (ABI): ABI, uygulamanızın makine kodundan çalışma zamanında sistemle nasıl etkileşim kurulmasının beklendiğini tam olarak tanımlar. NDK, bu tanımlara göre .so dosyaları oluşturur. Farklı ABI'ler farklı mimarilere karşılık gelir: NDK, 32 bit ARM, AArch64, x86 ve x86-64 için ABI desteği içerir. Daha fazla bilgi için Android ABI'leri konusuna bakın.

  • Manifest: Java bileşeni olmayan bir uygulama yazıyorsanız manifest öğesinde NativeActivity sınıfını bildirmeniz gerekir. Bunu nasıl yapacağınız hakkında daha ayrıntılı bilgi için native_activity.h arayüzünü kullanma bölümüne bakın.

Cereyan

Android için yerel uygulama geliştirmeyle ilgili genel akış şu şekildedir:

  1. Uygulamanızı tasarlayarak Java'da hangi parçaların uygulanacağına ve hangi bölümlerin yerel kod olarak uygulanacağına karar verin.

  2. Diğer Android projelerinde yaptığınız gibi bir Android uygulama projesi oluşturun.

  3. Yalnızca yerel bir uygulama yazıyorsanız AndroidManifest.xml öğesinde NativeActivity sınıfını tanımlayın. Daha fazla bilgi için Yerel etkinlikler ve uygulamalar konusuna bakın.

  4. Ad, işaretler, bağlı kitaplıklar ve "JNI" dizininde derlenecek kaynak dosyalar dahil olmak üzere yerel kitaplığı açıklayan bir Android.mk dosyası oluşturun.

  5. İsteğe bağlı olarak, hedef ABI'leri, araç zincirini, sürüm/hata ayıklama modunu ve STL'yi yapılandıran bir Application.mk dosyası oluşturabilirsiniz. Belirtmediğiniz bu değerler için sırasıyla aşağıdaki varsayılan değerler kullanılır:

    • ABI: kullanımdan kaldırılmayan tüm ABI'ler
    • Mod: Serbest bırakma
    • STL: sistem
  6. Yerel kaynağınızı projenin jni dizinine yerleştirin.

  7. Yerel (.so, .a) kitaplıkları derlemek için ndk-build'i kullanın.

  8. Yürütülebilir .dex dosyasını üreterek Java bileşenini oluşturun.

  9. Her şeyi, .so, .dex ve uygulamanızın çalışması için gereken diğer dosyaları içeren bir APK dosyasında paketleyin.

Yerel etkinlikler ve uygulamalar

Android SDK, tamamen yerel bir etkinlik yazmanıza olanak tanıyan NativeActivity adlı bir yardımcı sınıf sağlar. NativeActivity, Android çerçevesi ile yerel kodunuz arasındaki iletişimi gerçekleştirir. Böylece alt sınıflandırma yapmanız veya yöntemlerini çağırmanız gerekmez. Tek yapmanız gereken, uygulamanızın AndroidManifest.xml dosyanızda yerel olduğunu beyan etmek ve yerel uygulamanızı oluşturmaya başlamaktır.

NativeActivity kullanan bir Android uygulaması, diğer uygulamalardan korumalı alana alınmış kendi sanal makinesinde çalışmaya devam ediyor. Bu nedenle, JNI aracılığıyla Android çerçevesi API'lerine erişmeye devam edebilirsiniz. Sensörler, giriş etkinlikleri ve öğeler gibi durumlarda NDK, JNI üzerinden çağrı yapmak yerine kullanabileceğiniz yerel arayüzler sunar. Bu tür destek hakkında daha fazla bilgi için Yerel API'ler konusuna bakın.

Yerel etkinlik geliştirip geliştirmediğinizden bağımsız olarak, projelerinizi geleneksel Android derleme araçlarıyla oluşturmanızı öneririz. Bu şekilde Android uygulamalarının doğru yapıyla derlenip paketlenmesini sağlarsınız.

Android NDK, yerel etkinliğinizi uygulamanız için size iki seçenek sunar:

  • native_activity.h başlığı, NativeActivity sınıfının yerel sürümünü tanımlar. Yerel etkinliğinizi oluşturmak için ihtiyacınız olan geri çağırma arayüzünü ve veri yapılarını içerir. Geri çağırma işlemleri uygulamanızın ana iş parçacığında işlendiği için geri çağırma uygulamalarınız engellenmiyor olmalıdır. Bunlar engellerse ana iş parçanız geri çağırma geri gelene kadar yanıt vermeyeceğinden ANR (Uygulama Yanıt Vermiyor) hataları alabilirsiniz.
  • android_native_app_glue.h dosyası, native_activity.h arayüzünün üzerine oluşturulmuş statik bir yardımcı kitaplığı tanımlar. Bir etkinlik döngüsündeki geri çağırmalar veya giriş etkinlikleri gibi şeyleri işleyen başka bir iş parçacığı oluşturur. Bu etkinlikleri ayrı bir iş parçacığına taşımak, geri çağırmaların ana iş parçacınızı engellemesini önler.

Uygulamayı değiştirmenize olanak tanıyan <ndk_root>/sources/android/native_app_glue/android_native_app_glue.c kaynağı da mevcuttur.

Bu statik kitaplığın nasıl kullanılacağı hakkında daha fazla bilgi için yerel etkinlik örnek uygulamasını ve dokümanlarını inceleyin. <ndk_root>/sources/android/native_app_glue/android_native_app_glue.h dosyasındaki yorumlar bölümünde daha fazla bilgiye ulaşabilirsiniz.

yerel_activity.h arayüzünü kullanma

native_activity.h arayüzüyle yerel bir etkinlik uygulamak için:

  1. Projenizin kök dizininde bir jni/ dizini oluşturun. Bu dizin tüm yerel kodunuzu depolar.

  2. AndroidManifest.xml dosyasında yerel etkinliğinizi bildirin.

    Uygulamanızın Java kodu olmadığından android:hasCode öğesini false olarak ayarlayın.

    <application android:label="@string/app_name" android:hasCode="false">
    

    Etkinlik etiketinin android:name özelliğini NativeActivity olarak ayarlamanız gerekir.

    <activity android:name="android.app.NativeActivity"
              android:label="@string/app_name">
    

    meta-data etiketinin android:value özelliği, uygulamanın giriş noktasını (ör. C/C++ main) içeren paylaşılan kitaplığın adını belirtir ve kitaplık adından lib önekini ve .so son ekini hariç tutar.

    <manifest>
      <application>
        <activity>
          <meta-data android:name="android.app.lib_name"
                     android:value="native-activity" />
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
        </activity>
      </application>
    </manifest>
    
  3. Yerel etkinliğiniz için bir dosya oluşturun ve ANativeActivity_onCreate değişkeninde adlandırılmış işlevi uygulayın. Yerel etkinlik başladığında uygulama bu işlevi çağırır. C/C++'taki main işlevine benzer şekilde, bu işlev, yazmanız gereken çeşitli geri çağırma uygulamalarına işlev işaretçileri içeren bir ANativeActivity yapısına işaretçi alır. Geri çağırma işlemlerinizin uygulanması için ANativeActivity->callbacks içinde geçerli geri çağırma işlevi işaretçilerini ayarlayın.

  4. ANativeActivity->instance alanını, kullanmak istediğiniz belirli veri örneklerinin adresine ayarlayın.

  5. Etkinliğinizin başladıktan sonra yapmasını istediğiniz diğer her şeyi uygulayın.

  6. ANativeActivity->callbacks politikasında ayarladığınız geri çağırmaları geri uygulayın. Geri çağırmaların ne zaman çağrıldığı hakkında daha fazla bilgi için Etkinlik Yaşam Döngüsünü Yönetme bölümüne bakın.

  7. Uygulamanızın geri kalanını geliştirin.

  8. Yerel modülünüzü derleme sistemine tanımlamak için projenizin jni/ dizininde bir Android.mk file oluşturun. Daha fazla bilgi için Android.mk sayfasına bakın.

  9. Android.mk dosyası oluşturduktan sonra ndk-build komutunu kullanarak yerel kodunuzu derleyin.

    cd <path>/<to>/<project>
    $NDK/ndk-build
    
  10. Android projenizi her zamanki gibi oluşturup yükleyin. Yerel kodunuz jni/ dizinindeyse derleme komut dosyası, kendisinden oluşturulan .so dosyasını otomatik olarak APK'da paketler.

Ek örnek kod

NDK örneklerini indirmek için NDK Örnekleri sayfasına bakın.