Başlamadan önce
Bu kılavuzda, yerel programlamada ve Android geliştirmede doğası gereği kavramlara aşina olduğunuz varsayılmaktadır.
Giriş
Bu bölümde, NDK'nın işleyiş şekliyle ilgili genel bir açıklama sunulmaktadır. Android NDK, Android uygulamalarınıza C veya C++ ("yerel kod") yerleştirmenize olanak tanıyan bir araç setidir. Android uygulamalarında yerel kod kullanabilme özelliği, özellikle aşağıdakilerden en az birini yapmak isteyen geliştiriciler için faydalı olabilir:
- Uygulamalarını platformlar arasında taşımak.
- Mevcut kitaplıkları yeniden kullanın veya kendi kitaplıklarını yeniden kullanın.
- Belirli durumlarda, özellikle de oyunlar gibi yoğun olarak işlem yapılanlarda performansı artırın.
İşleyiş şekli
Bu bölümde, Android için yerel uygulama oluşturmada kullanılan ana bileşenler tanıtılmış ve oluşturma ve paketleme işlemi 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, statik kitaplıklar veya başka kitaplıklara bağlayabileceğiniz
.a
dosyaları da oluşturabilir.Java Yerel Arayüzü (JNI): Java ve CNI, Java ile C++ bileşenlerinin birbirleriyle iletişim kurduğu arayüzdür. Bu kılavuzda JNI konusunda bilgi sahibi olduğunuz varsayılır. Bu konu hakkında bilgi edinmek için Java Yerel Arayüz Spesifikasyonu'na başvurabilirsiniz.
Uygulama İkili Arabirimi (ABI): ABI, uygulamanızın makine kodunun, çalışma zamanında sistemle tam olarak nasıl etkileşim kurmasının beklendiğini tanımlar. NDK, bu tanımlara uygun
.so
dosya oluşturur. Farklı ABI'ler farklı mimarilere karşılık gelir: NDK, 32 bit ARM, AArch64, x86 ve x86-64 için ABI desteğini içerir. Daha fazla bilgi için Android API'leri bölümüne bakın.Manifest: Herhangi bir Java bileşeni içermeyen bir uygulama yazıyorsanız manifest işlevinde NativeActivity sınıfını bildirmeniz gerekir. Bunun nasıl yapılacağıyla ilgili daha fazla bilgi için native_activity.h arayüzünü kullanma bölümüne göz atın.
Cereyan
Android için yerel uygulama geliştirme süreci şu şekildedir:
Uygulamanızı tasarlarken Java'da hangi bölümlere ve yerel kod olarak hangi bölümlere uygulanacağına karar verin.
Diğer Android projelerinde olduğu gibi bir Android uygulama projesi oluşturun.
Yalnızca yerel uygulama yazıyorsanız
AndroidManifest.xml
uygulamasında NativeActivity sınıfını bildirin. Daha fazla bilgi için Yerel etkinlikler ve uygulamalar bölümüne 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ılmamış tüm ABI'lar
- Mod: Sürüm
- STL: sistem
Yerel kaynağınızı, projenin
jni
dizininin altına yerleştirin.Yerel (
.so
,.a
) kitaplıkları derlemek için ndk-build kullanın.Yürütülebilir
.dex
dosyasını oluşturarak Java bileşenini oluşturun.Her şeyi, bir APK dosyasında paketleyerek
.so
,.dex
ve uygulamanızın çalışması için gereken diğer dosyaları ekleyin.
Yerel etkinlikler ve uygulamalar
Android SDK'sı, tamamen yerel bir etkinlik yazmanıza olanak tanıyan NativeActivity yardımcı sınıfı sağlar. NativeActivity, Android çerçevesi ile yerel kodunuz arasındaki iletişimi işler. Böylece, çerçeveyi alt sınıflara ayırmanı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'yi kullanan bir Android uygulaması, diğer uygulamalardan korumalı alana alınmış kendi sanal makinesinde çalışmaya devam eder. Dolayısıyla, Android çerçeve API'larına JNI aracılığıyla erişmeye devam edebilirsiniz. NDK, sensörler, giriş etkinlikleri ve öğeler gibi belirli durumlarda JNI üzerinden arama yapmak yerine kullanabileceğiniz yerel arayüzler sağlar. Bu tür destek hakkında daha fazla bilgi için Yerel API'ler bölümüne bakın.
Yerel bir etkinlik geliştirip geliştirmediğinizden bağımsız olarak, projelerinizi geleneksel Android oluşturma araçlarıyla oluşturmanızı öneririz. Bu şekilde, Android uygulamalarının doğru yapıyla derlenip paketlenmesini sağlayabilirsiniz.
Android NDK, yerel etkinliğinizi uygulamak 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 ihtiyaç duyduğunuz geri çağırma arayüzünü ve veri yapılarını içerir. Geri çağırma, uygulamanızın ana iş parçacığı tarafından işlendiği için geri çağırma uygulamalarınız engellenmemelidir. Bu uygulamalar engellenirse ana mesaj diziniz geri çağırmaya dönene 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 inşa edilmiş statik bir yardımcı kitaplık tanımlar. Bir geri çağırma veya giriş etkinlikleri gibi işlemleri etkinlik döngüsünde işleyen başka bir ileti dizisi oluşturur. Bu etkinlikleri ayrı bir ileti dizisine taşımak, geri çağırmaların ana ileti dizinizi 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 yorumlarda daha fazla bilgi bulabilirsiniz.
local_activity.h arayüzünü kullanma
Yerel etkinliği native_activity.h arayüzüyle 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ızda Java kodu bulunmadığından
android:hasCode
değerinifalse
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, uygulamaya giriş girişini içeren paylaşılan kitaplığın adını (C/C++main
gibi) belirtir ve kitaplık adındanlib
önekini ve.so
son ekini içermez.<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 belirtilen işlevi uygulayın. Yerel etkinlik başladığında uygulama bu işlevi çağırır. C/C++ işlevindeki
main
işlevine benzer 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 eder.ANativeActivity->callbacks
içindeki geri çağırma işlevinin geçerli işaretçilerini geri çağırmalarınızın uygulamalarına ayarlayın.ANativeActivity->instance
alanını, kullanmak istediğiniz belirli veri örneklerinin adresine ayarlayın.Etkinliğinizin başlamasını istediğiniz diğer her şeyi uygulayın.
ANativeActivity->callbacks
içinde ayarladığınız geri çağırmaların geri kalanını 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 bölümüne bakın.Android.mk dosyanızı 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ı, bu koddan oluşturulan.so
dosyalarını APK'da otomatik olarak paketler.
Ek örnek kod
NDK örneklerini indirmek için NDK Örnekleri bölümüne bakın.