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:
Uygulamanızı tasarlayarak Java'da hangi parçaların uygulanacağına ve hangi bölümlerin yerel kod olarak uygulanacağına karar verin.
Diğer Android projelerinde yaptığınız gibi bir Android uygulama projesi oluşturun.
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.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.İ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
Yerel kaynağınızı projenin
jni
dizinine yerleştirin.Yerel (
.so
,.a
) kitaplıkları derlemek için ndk-build'i kullanın.Yürütülebilir
.dex
dosyasını üreterek Java bileşenini oluşturun.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:
Projenizin kök dizininde bir
jni/
dizini oluşturun. Bu dizin tüm yerel kodunuzu depolar.AndroidManifest.xml
dosyasında yerel etkinliğinizi bildirin.Uygulamanızın Java kodu olmadığından
android:hasCode
öğesinifalse
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
etiketininandroid: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ındanlib
ö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>
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çinANativeActivity->callbacks
içinde geçerli geri çağırma işlevi işaretçilerini ayarlayın.ANativeActivity->instance
alanını, kullanmak istediğiniz belirli veri örneklerinin adresine ayarlayın.Etkinliğinizin başladıktan sonra yapmasını istediğiniz diğer her şeyi uygulayın.
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.Uygulamanızın geri kalanını geliştirin.
Yerel modülünüzü derleme sistemine tanımlamak için projenizin
jni/
dizininde birAndroid.mk file
oluşturun. Daha fazla bilgi için Android.mk sayfasına bakın.Android.mk dosyası oluşturduktan sonra
ndk-build
komutunu kullanarak yerel kodunuzu derleyin.cd <path>/<to>/<project> $NDK/ndk-build
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.