Kavramlar

Başlamadan önce

Bu kılavuzda, dijital ortamda yerleşik olarak bulunan kavramları zaten bildiğiniz varsayılarak yerel programlama ve Android geliştirme.

Giriş

Bu bölümde, NDK'nın nasıl çalıştığı hakkında ileri düzey bir açıklama sunulmaktadır. Android NDK, araçları sayesinde Android uygulamalarınıza C veya C++ ("yerel kod") yerleştirebilirsiniz. Bir projeyi Android uygulamalarındaki yerel kod, özellikle şunlardan en az birini yapmak isteyen geliştiriciler için yararlı olabilir: şu:

  • Uygulamalarını platformlar arasında taşımalıdır.
  • Mevcut kitaplıkları yeniden kullanın veya yeniden kullanım için kendi kitaplıklarını sağlayın.
  • Özellikle yoğun işlem gerektiren belirli durumlarda performansı artırır. oyunlar için de geçerlidir.

İşleyiş şekli

Bu bölümde, yerel reklam oluştururken kullanılan ana bileşenler açıklanmaktadır ve Android için uygulama oluşturma ve oluşturma sürecini çok önemlidir.

Ana bileşenler

Projenizi oluştururken aşağıdaki bileşenleri iyice anlamış olmalısınız: uygulama:

  • Yerel paylaşılan kitaplıklar: NDK, bu kitaplıkları veya .so dosyalarını C/C++ kaynak kodunuza gider.

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

  • Java Native Interface (JNI): JNI, Java ve programlamanın üzerinden C++ bileşenleri birbirleriyle iletişim kurar. Bu kılavuzda JNI hakkında bilgi sahibi olduğu varsayılır; hakkında bilgi için Java Yerel Arayüz Spesifikasyonu'na bakın.

  • Uygulama İkili Arabirimi (ABI): ABI, uygulamanızın özelliklerinin tam olarak nasıl makine kodunun çalışma zamanında sistemle etkileşime geçmesi beklenir. NDK bu tanımlara göre .so dosyası oluşturur. Farklı ABI'ler NDK, 32 bit ARM, AArch64, x86 ve x86-64. Daha fazla bilgi için Android ABI'ler.

  • Manifest: Java bileşeni olmayan bir uygulama yazıyorsanız NativeActivity sınıfını manifest dosyası olarak kaydedin. Bkz. Native_activity.h arayüzünü ziyaret ederek bunu nasıl yapacağınızla ilgili daha fazla bilgi edinebilirsiniz.

Akma

Android için yerel uygulama geliştirmeye ilişkin genel akış aşağıdaki gibidir:

  1. Uygulamanızı tasarlayın, Java'da hangi bölümlerin uygulanacağına ve hangi bölümlerin uygulanacağına karar verin yerel kod olarak uygulanacak.

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

  3. Yalnızca yerel uygulama yazıyorsanız NativeActivity sınıfını şurada bildirin: AndroidManifest.xml. Daha fazla bilgi için Yerel etkinlikler ve uygulamalar.

  4. Yerel kitaplığı açıklayan bir Android.mk dosyası oluşturun. Bu dosya, dosyanın adı ve "JNI" içinde derlenecek flag'ler, bağlı kitaplıklar ve kaynak dosyaları dizin.

  5. İsteğe bağlı olarak, hedefi yapılandıran bir Application.mk dosyası oluşturabilirsiniz ABI'ler, araç zinciri, yayınlama/hata ayıklama modu ve STL. Bunlardan herhangi biri için belirtilmezse sırasıyla aşağıdaki varsayılan değerler kullanılır:

    • ABI: kullanımdan kaldırılmamış tüm ABI'lar
    • Mod: Bırak
    • 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ı üreten Java bileşenini derleyin.

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

Yerel etkinlikler ve uygulamalar

Android SDK'sı, şunları yapmanızı sağlayan bir yardımcı sınıf olan NativeActivity'yi sağlar. tamamen yerel bir etkinlik yazmanız gerekir. NativeActivity, iletişimi yönetir yerel kodunuz arasında gidip gelir. Böylece, veya yöntemlerini çağırabilir. Tek yapmanız gereken başvurunuzu beyan etmek AndroidManifest.xml dosyanızda yerel olmasını sağlayın ve yerel dosyanızı oluşturmaya başlayın bir uygulamadır.

NativeActivity kullanan bir Android uygulaması, kendi sanal makinesinde çalışmaya devam ediyor. diğer uygulamalardan korumalı alana alın. Bu nedenle, JNI aracılığıyla Android çerçevesi API'leri Örneğin, sensörler için NDK, kullanabileceğiniz yerel arayüzler sağlar. ya da JNI'yi kullanarak arama yapmak zorunda kalmazsınız. Bu tür iletişimler için desteği için Yerel API'ler bölümüne bakın.

Yerel bir etkinlik geliştiriyor olsanız da olmasanız da, geleneksel Android geliştirme araçlarıyla oluşturduğunuzu göstereceğim. İşlem devam ediyor Android uygulamalarının doğru tarayıcıyla derlenmesini ve paketlenmesini inceleyeceğiz.

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. Belge, yerel reklam öğenizi oluşturmak için ihtiyacınız olan geri çağırma arayüzü ve veri yapıları etkinliği'ne dokunun. Uygulamanızın ana iş parçacığı geri çağırmaları yaptığından, geri çağırma uygulamalarınız engellenmemelidir. Kullanıcılar sizi engellerse ana iş parçacığınız geri arama geri gelene kadar yanıt vermez.
  • android_native_app_glue.h dosyası, native_activity.h arayüzünün üst kısmında. Daha fazla iş parçacığının Bir etkinlik döngüsündeki geri çağırma veya giriş etkinlikleri gibi işlemleri gerçekleştirir. Hareket halinde veya başka bir ileti dizisine geri çağırmak, geri çağırmaların iş parçacığı.

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

Bu statik kitaplığın nasıl kullanılacağıyla ilgili daha fazla bilgi için yerel etkinlik örnek uygulaması ve belgeleri. Daha fazla bilgi: buradaki yorumlar bölümünde de <ndk_root>/sources/android/native_app_glue/android_native_app_glue.h. dosyası olarak kaydedebilirsiniz.

Native_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 yerel kodunuzun tamamını depolar.

  2. AndroidManifest.xml dosyasında yerel etkinliğinizi tanımlayın.

    Uygulamanızda Java kodu olmadığından android:hasCode değerini false olarak ayarlayın.

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

    Etkinlik etiketinin android:name özelliğini NativeActivity.

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

    meta-data etiketinin android:value özelliği uygulamaya giriş noktasını içeren paylaşılan kitaplık (örneğin, C/C++ main), lib öneki ve .so son eki kitaplıktan çıkarılır dokunun.

    <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şkeni. yerel etkinlik başlar. C/C++ işlevindeki main işlevine benzer şekilde bu işlev, işlev işaretçileri içeren bir ANativeActivity yapısının işaretçisi geri çağırma uygulamalarına göz atalım. Ayarlayın: ANativeActivity->callbacks içindeki geçerli geri çağırma işlevi işaretçileri uygulama süreci hakkında bilgi edineceksiniz.

  4. ANativeActivity->instance alanını verileri seçin.

  5. Başlangıçta etkinliğinizin yapmasını istediğiniz diğer şeyleri uygulayın.

  6. ANativeActivity->callbacks Geri çağırmaların ne zaman Etkinlik Yaşam Döngüsü'nü Yönetme bölümünü inceleyin.

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

  8. Aşağıdaki işlemler için projenizin jni/ dizininde bir Android.mk file oluşturun: yerel modülünüzü derleme sistemine açıklayın. Daha fazla bilgi için bkz. Android.mk.

  9. Android.mk dosyanız olduğunda, ndk-build komutudur.

    cd <path>/<to>/<project>
    $NDK/ndk-build
    
  10. Android projenizi her zamanki gibi derleyip yükleyin. Yerel kodunuz jni/ dizinini seçerseniz derleme komut dosyası .so öğesini otomatik olarak paketler dosyalardan derlemenizi sağlar.

Ek örnek kod

NDK örneklerini indirmek için NDK Örnekleri bölümüne bakın.