Bu sayfada,Android.mk
ndk-build
.
Genel Bakış
Android.mk
dosyası, projenizin jni/
dizininin bir alt dizininde yer alır
dizinini oluşturur ve kaynaklarınızı ve paylaşılan kitaplıklarınızı derleme sistemine açıklar.
Bu, derleme sisteminin bir kez veya bir süre için ayrıştırdığı küçük bir GNU oluşturma dosyası
daha fazla. Android.mk
dosyası, kullanılabilecek proje genelindeki ayarları tanımlamak için yararlıdır:
Application.mk
, derleme sistemi ve ortam değişkenleriniz
tanımlanmadı. Ayrıca, belirli modüller için proje genelindeki ayarları da geçersiz kılabilir.
Android.mk
söz dizimi, kaynaklarınızı modüller halinde gruplandırmanıza olanak tanır.
Modüller statik bir kitaplık, paylaşılan kitaplık veya bağımsız
yürütülebilir. Her Android.mk
dosyasında bir veya daha fazla modül tanımlayabilirsiniz.
Aynı kaynak dosyayı birden fazla modülde kullanabilirsiniz. Yalnızca derleme sistemi
paylaşılan kitaplıkları uygulama paketinize yerleştirir. Ayrıca, statik
kitaplıklar paylaşılan kitaplıklar oluşturabilir.
Derleme sistemi, paketleme kitaplıklarının yanı sıra
bazı ipuçları vereceğim. Örneğin, başlık dosyalarını veya müstehcen dosyaları listelemeniz gerekmez.
Android.mk
dosyanızdaki oluşturulan dosyalar arasındaki bağımlılıkları belirleyin. NDK yapısı
sistem bu ilişkileri sizin için otomatik olarak hesaplar. Bunun sonucunda,
gelecekteki NDK'da yeni araç zincirinden/platform desteğinden yararlanabilmeli
Android.mk
dosyanıza dokunmanıza gerek kalmadan serbest bırakılır.
Bu dosyanın söz dizimi, Android.mk
dosyalarında kullanılan söz dizimine çok yakın
tam Android Açık Kaynak Projesi ile dağıtılmıştır. Derleme sistemi
bunları kullanan uygulamanın farklı olması, benzerliklerin kasıtlı
uygulama geliştiricilerinin, uygulama geliştirmelerini kolaylaştırmak amacıyla
kaynak kodundan
yararlanabilirsiniz.
Temel Bilgiler
Söz dizimini ayrıntılı olarak incelemeden önce,
Android.mk
dosyasının içeriğiyle ilgili temel bilgileri içerir. Bu bölümde,
Bu hedefe doğru, Hello-JNI örneğindeki Android.mk
dosyasını kullanarak
dosyadaki her satırın oynatılmasını sağlar.
Android.mk
dosyası, LOCAL_PATH
değişkenini tanımlayarak başlamalıdır:
LOCAL_PATH := $(call my-dir)
Bu değişken, geliştirmedeki kaynak dosyaların konumunu gösterir
ağacı. Bu örnekte, derleme sistemi tarafından sağlanan my-dir
makro işlevi,
geçerli dizinin (Android.mk
içeren dizin) yolu
dosyası) ekleyebilirsiniz.
Bir sonraki satırda, derleme sistemi değeri olan CLEAR_VARS
değişkeni belirtilir
sağlar.
include $(CLEAR_VARS)
CLEAR_VARS
değişkeni, birçok öğeyi temizleyen özel bir GNU Makefile'a işaret ediyor
Sizin için LOCAL_XXX
gibi LOCAL_MODULE
, LOCAL_SRC_FILES
ve
LOCAL_STATIC_LIBRARIES
. LOCAL_PATH
öğesinin temizlenmediğini unutmayın. Bu
sistem tüm derleme kontrolü dosyalarını ayrıştırdığı için değişkenin değerini korumalıdır
tek bir GNU Tüm değişkenlerin global olduğu yürütme bağlamı sağlayın. Şunu yapmalısınız:
her modülü açıklamadan önce bu değişkeni (yeniden) belirtin.
Daha sonra, LOCAL_MODULE
değişkeni istediğiniz modülün adını
seçeceğiz. Bu değişkeni uygulamanızdaki her modül için bir kez kullanın.
LOCAL_MODULE := hello-jni
Her modül adı benzersiz olmalı ve boşluk içermemelidir. Derleme sistemi,
dosyayı oluşturduğunda uygun dosyayı otomatik olarak ekler ve
ön eki ve son eki, LOCAL_MODULE
öğesine atadığınız ada eklenir. Örneğin,
yukarıda görünen örnek,
libhello-jni.so
Sonraki satır, kaynak dosyaları numaralandırır ve birden çok değeri boşluklarla sınırlandırır. dosyalar:
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES
değişkeni, C ve/veya C++ kaynak dosyalarının listesini içermelidir
bir yöntem de vardır.
Son satır, sistemin her şeyi birbirine bağlamasına yardımcı olur:
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY
değişkeni, aynı türde bir GNU Makefile komut dosyasına
en fazla dönüşüm elde ettikten sonra, LOCAL_XXX
değişkende tanımladığınız tüm bilgileri
son include
. Bu komut dosyası neyin oluşturulacağını ve nasıl yapılacağını belirler.
Örnek dizinlerinde, açıklama eklenmiş daha karmaşık örnekler vardır.
Bakabileceğiniz Android.mk
dosya var. Ayrıca, Örnek: yerel etkinlik
, söz konusu örneğin Android.mk
dosyasıyla ilgili ayrıntılı bir açıklama sunar. En son,
Değişkenler ve makrolar, bu değişken hakkında daha fazla bilgi sağlar.
bölümüne bakın.
Değişkenler ve makrolar
Derleme sistemi, Android.mk
dosyasında kullanılabilecek birçok olası değişken sağlar.
Bu değişkenlerin çoğu önceden atanmış değerlerle birlikte gelir. Diğerlerini siz atarsınız.
Bu değişkenlere ek olarak kendi rastgele değişkenlerinizi de tanımlayabilirsiniz. İstiyorsanız NDK derleme sisteminin aşağıdaki değişken adlarını sakladığını unutmayın:
LOCAL_
ile başlayanLOCAL_MODULE
gibi adlar.PRIVATE_
,NDK_
veyaAPP
ile başlayan adlar. Derleme sistemi içgüdülerini güçlendiriyor.- Küçük harfli adlar (ör.
my-dir
). Derleme sistemi, bunu dahili olarak olur.
Bir Android.mk
dosyasında kendi kolaylık değişkenlerinizi tanımlamanız gerekirse,
adlarının başına MY_
eklemelerini öner.
NDK tarafından tanımlanan içerme değişkenleri
Bu bölümde, derleme sisteminin tanımladığı GNU Yapma değişkenleri ele alınmaktadır
Android.mk
dosyanızı ayrıştırmadan önce. NDK, bazı durumlarda
Android.mk
dosyanızı farklı bir tanım kullanarak birkaç kez ayrıştırabilir
bazıları için otomatik olarak ekler.
TEMİZLE_VARS
Bu değişken, neredeyse tüm LOCAL_XXX
tanımını kaldıran bir derleme komut dosyasına işaret ediyor
"Geliştirici tanımlı değişkenler"de listelenen değişkenler bölümüne bakın. Bunu kullan
değişkeni kullanabilirsiniz. Söz dizimi
en iyi uygulamaları paylaşacağız:
include $(CLEAR_VARS)
BUILD_EXECUTABLE (Yürütülebilir)
Bu değişken, isimli bir komut dosyasıyla ilgili tüm bilgileri toplayan bir
LOCAL_XXX
değişkenlerinizde sağladığınız modülü ve
listelediğiniz kaynaklardan yürütülebilir bir hedef dosya derleyin. Bu
komut dosyası, LOCAL_MODULE
öğesine zaten değer atadığınızı ve
En az LOCAL_SRC_FILES
(bu değişkenler hakkında daha fazla bilgi için
Modül açıklaması değişkenleri).
Bu değişkeni kullanmak için söz dizimi şöyledir:
include $(BUILD_EXECUTABLE)
PAYLAŞILAN_KİTAPLIK
Bu değişken, isimli bir komut dosyasıyla ilgili tüm bilgileri toplayan bir
LOCAL_XXX
değişkenlerinizde sağladığınız modülü ve
listelediğiniz kaynaklardan paylaşılan bir hedef kitaplık oluşturun. Bu
komut dosyası, LOCAL_MODULE
öğesine zaten değer atadığınızı ve
En az LOCAL_SRC_FILES
(bu değişkenler hakkında daha fazla bilgi için
Modül açıklaması değişkenleri).
Bu değişkeni kullanmak için söz dizimi şöyledir:
include $(BUILD_SHARED_LIBRARY)
Paylaşılan kitaplık değişkeni, derleme sisteminin bir kitaplık dosyası oluşturmasına neden olur
.so
uzantılı.
BUILD_STATIC_KİTAPLIĞI
Statik kitaplık oluşturmak için kullanılan BUILD_SHARED_LIBRARY
varyantı. İlgili içeriği oluşturmak için kullanılan
derleme sistemi, statik kitaplıkları projenize/paketlerinize kopyalamaz ancak
bunları paylaşılan kitaplıklar oluşturmak için kullanabilir (bkz. LOCAL_STATIC_LIBRARIES
ve
LOCAL_WHOLE_STATIC_LIBRARIES
). Bu değişkeni kullanmak için söz dizimi şöyledir:
include $(BUILD_STATIC_LIBRARY)
Bir statik-kitaplık değişkeni, derleme sisteminin
.a
uzantısı var.
PREBUILT_SHARED_LIBRARY
Önceden oluşturulmuş paylaşılan bir kitaplığı belirtmek için kullanılan bir derleme komut dosyasına yönlendirir. Beğenmekten vazgeç
BUILD_SHARED_LIBRARY
ve BUILD_STATIC_LIBRARY
için geçerlidir. Burada
LOCAL_SRC_FILES
kaynak dosya olamaz. Bunun yerine, değer teslim etmek için
foo/libfoo.so
gibi önceden oluşturulmuş paylaşılan bir kitaplık. Bu
değişkeni şu şekildedir:
include $(PREBUILT_SHARED_LIBRARY)
Ayrıca
LOCAL_PREBUILTS
değişkeni Önceden oluşturulmuş öğeleri kullanma hakkında daha fazla bilgi için
Önceden oluşturulmuş kitaplıkları kullanın.
PREBUILT_STATIC_KİTAPLIĞI
PREBUILT_SHARED_LIBRARY
ile aynıdır, ancak önceden oluşturulmuş statik bir kitaplıktır. Örneğin,
Önceden oluşturulmuş kitaplıkları kullanma hakkında daha fazla bilgi için Önceden oluşturulmuş kitaplıkları kullanma başlıklı makaleyi inceleyin.
Hedef bilgi değişkenleri
Derleme sistemi Android.mk
öğesini, APP_ABI
tarafından belirtilen ABI başına bir kez ayrıştırır
değişkenidir. Bu değişken, genellikle Application.mk
dosyanızda tanımlanır. Eğer APP_ABI
ise
all
ise derleme sistemi, Android.mk
değerini ABI başına NDK başına bir kez ayrıştırır
destekler. Bu bölümde, derleme sisteminin her
Android.mk
ayrıştırır.
HEDEF_ARCH
Bu Android.mk
öğesini ayrıştırırken derleme sisteminin hedeflediği CPU ailesi
dosyası olarak kaydedebilirsiniz. Bu değişken şunlardan biri olacaktır: arm
, arm64
, x86
veya x86_64
.
HEDEF_PLATFORM
Bunu ayrıştırırken derleme sisteminin hedeflediği Android API düzeyi numarası
Android.mk
dosyası yükleyin. Örneğin, Android 5.1 sistem görüntüleri
Android API düzeyi 22: android-22
. Platform adlarının tam listesi ve
ilgili Android sistem görüntüleri için Yerel API'ler bölümüne bakın. İlgili içeriği oluşturmak için kullanılan
aşağıdaki örnekte bu değişkeni kullanmak için gereken söz dizimi gösterilmektedir:
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
HEDEF_ARCH_ABI
Bu Android.mk
dosyasını ayrıştırırken derleme sisteminin hedeflediği ABI.
Tablo 1'de, desteklenen her CPU ve mimari için kullanılan ABI ayarı gösterilmektedir.
Tablo 1. Farklı CPU'lar ve mimariler için ABI ayarları.
CPU ve mimari | Ayar |
---|---|
RM7 | armeabi-v7a |
ARMv8 AArch64 | arm64-v8a |
i686 | x86 |
x86-64 | x86_64 |
Aşağıdaki örnekte, hedef olarak ARMv8 AArch64'ün nasıl kontrol edileceği gösterilmektedir CPU ve ABI kombinasyonu:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# ... do something ...
endif
Mimari ABI'ler ve ilgili uyumluluk sorunları hakkında daha fazla bilgi için Android ABI'lerine bakın.
Gelecekteki yeni hedef ABI'ler farklı değerlere sahip olacak.
HEDEF_ABI
Hedef Android API düzeyi ile ABI'nın birleşimi. Bu, özellikle de belirli bir hedef sistem görüntüsüne göre test etmek istediğinizde Örneğin, Android API düzeyi 22'de çalışan 64 bit ARM cihazı olup olmadığını kontrol etmek için:
ifeq ($(TARGET_ABI),android-22-arm64-v8a)
# ... do something ...
endif
Modül açıklaması değişkenleri
Bu bölümdeki değişkenler, modülünüzü derleme sistemine açıklar. Her biri modülün açıklaması şu temel akışı izlemelidir:
-
CLEAR_VARS
değişkeni - Modülü tanımlamak için kullanılan değişkenlere değerler atayın.
- NDK derleme sistemini, modül için uygun derleme komut dosyasını kullanacak şekilde ayarlayın,
BUILD_XXX
değişkeni kullanılır.
YEREL_YOL
Bu değişken, geçerli dosyanın yolunu vermek için kullanılır. Tanımlayın
Android.mk
dosyanızın başına ekleyin. Aşağıdaki örnekte,
dolayısıyla:
LOCAL_PATH := $(call my-dir)
CLEAR_VARS
tarafından işaret edilen komut dosyası, bu değişkeni temizlemez. Dolayısıyla,
Android.mk
dosyanız olsa bile yalnızca bir kez tanımlamanız gerekir.
birden fazla modülün açıklanmasıdır.
YEREL_MODÜL
Bu değişken, modülünüzün adını depolar. Tüm modüller arasında benzersiz olmalıdır.
olmalı ve boşluk içermemelidir. Herhangi bir
komut dosyaları (CLEAR_VARS
için olandan farklı). lib
öneki veya .so
ya da .a
dosya uzantısı; derleme sistemi bunları
pek çok yolu vardır. Android.mk
ve Application.mk
boyunca
dosyalarını değiştirirseniz modülünize değiştirilmemiş adıyla bakın. Örneğin,
satır sonuçları libfoo.so
adlı paylaşılan bir kitaplık modülünün oluşturulmasıyla sonuçlanır:
LOCAL_MODULE := "foo"
Oluşturulan modülün lib
+
LOCAL_MODULE
değerini belirlemek için LOCAL_MODULE_FILENAME
değişkenini kullanabilirsiniz
kendi seçtiğiniz bir adla oluşturulmuş bir modül verebilirsiniz.
LOCAL_MODULE_FILENAME
Bu isteğe bağlı değişken, derleme sistemi tarafından verilen adları geçersiz kılmanıza
varsayılan olarak kullanır. Örneğin,
LOCAL_MODULE
foo
. Sistemi, oluşturduğu dosyayı çağırmaya zorlayabilirsiniz
libnewfoo
. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
Paylaşılan kitaplık modülü için bu örnek,
libnewfoo.so
LOCAL_SRC_FILES
Bu değişken, derleme sisteminin kullandığı
oluşturacağım. Yalnızca derleme sisteminin gerçekten aktardığı dosyaları listeleyin
tarafından otomatik olarak hesaplandığından, derleyici için
ve bildirmeyi konuştuk. Hem göreli (LOCAL_PATH
ile) hem de mutlak değerlerin kullanılabileceğini unutmayın.
dosya yolları.
Mutlak dosya yollarından kaçınmanızı öneririz; göreli yollar, Android.mk
daha taşınabilir hale getiriyoruz.
YEREL_PBM_UZANTIsı
İsteğe bağlı bu değişkeni
C++ kaynak dosyalarınız için .cpp
. Örneğin, aşağıdaki satırda
.cxx
uzantısına sahip. (Ayar, noktayı içermelidir.)
LOCAL_CPP_EXTENSION := .cxx
Birden çok uzantı belirtmek için bu değişkeni kullanabilirsiniz. Örneğin:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
YEREL_ABM_ÖZELLİKLERİ
Kodunuzun belirli bir koda dayalı olduğunu belirtmek için bu isteğe bağlı değişkeni
C++ özellikleri hakkında daha fazla bilgi edinin. Derleme sırasında doğru derleyici ve bağlayıcı işaretlerini etkinleştirir
bahsedeceğim. Bu değişken, önceden oluşturulmuş ikili programlar için
bağlı olarak değişiklik gösterir. Böylece, nihai bağlantının doğru şekilde çalıştığından emin olabilirsiniz. Biz
-frtti
ve
-fexceptions
değerini doğrudan LOCAL_CPPFLAGS
tanımınızda bulabilirsiniz.
Bu değişkenin kullanılması, derleme sisteminin
inceleyeceğiz. LOCAL_CPPFLAGS
kullanılması, derleyicinin belirtilen tüm bilgileri kullanmasına neden olur.
bayraklarını pekiştirmeniz gerekir.
Örneğin, kodunuzun RTTI (Çalışma Zamanı Türü Bilgisi) kullandığını belirtmek için yaz:
LOCAL_CPP_FEATURES := rtti
Kodunuzun C++ istisnalarını kullandığını belirtmek için şunu yazın:
LOCAL_CPP_FEATURES := exceptions
Bu değişken için birden çok değer de belirtebilirsiniz. Örnek:
LOCAL_CPP_FEATURES := rtti features
Değerleri açıklama sıranız önemli değildir.
YEREL_C_DAHİL
Bu isteğe bağlı değişkeni,
Tümünü derlerken dahil et arama yoluna eklemek için NDK root
dizini
kaynakları (C, C++ ve Assembly) içerir. Örnek:
LOCAL_C_INCLUDES := sources/foo
Hatta:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
Dahil olma bayraklarını
LOCAL_CFLAGS
veya LOCAL_CPPFLAGS
.
Derleme sistemi, başlatılırken otomatik olarak LOCAL_C_INCLUDES
yollarını da kullanır
ndk-gdb ile yerel hata ayıklama.
YEREL_CFLAGS
Bu isteğe bağlı değişken,
C ve C++ kaynak dosyaları oluşturmak için de kullanabilirsiniz. Bu özellik, proje yöneticisi olarak
ek makro tanımları veya derleme seçenekleri belirtme. LOCAL_CPPFLAGS
hesabını kullan
kullanın.
Android.mk
dosyanızda optimizasyon/hata ayıklama düzeyini değiştirmemeye çalışın.
Derleme sistemi
Application.mk
dosyasındaki alakalı bilgiler. Bu sayede
hata ayıklama sırasında kullanılan faydalı veri dosyaları oluşturmak için derleme sistemi.
Aşağıdakileri yazarak ek dahil etme yolları belirtebilirsiniz:
LOCAL_CFLAGS += -I<path>,
Ancak LOCAL_C_INCLUDES
kullanmak daha iyidir çünkü
Böylece, yerel hata ayıklama için kullanılabilecek yolların
ndk-gdb.
YEREL_ASKFLAGS
C++ kaynağı derlenirken iletilecek isteğe bağlı bir derleyici işaretleri grubu
yalnızca dosyalara erişebilir. Bunlar derleyicide LOCAL_CFLAGS
sonra görünür
komut satırından erişebilirsiniz. Hem C hem de C++ için işaretleri belirtmek üzere LOCAL_CFLAGS
öğesini kullanın.
YEREL_STATIC_KİTAPLIKLAR
Bu değişken, geçerli değişiklik gösterir.
Geçerli modül paylaşılan bir kitaplık veya yürütülebilir bir modülse bu değişken bu kitaplıkları elde edilen ikili değere bağlanmaya zorlar.
Geçerli modül statik bir kitaplıksa bu değişken mevcut modüllere bağlı olan diğer modüller de listelenen kitaplıklar.
LOCAL_SHARED_LIBRARIES
Bu değişken, bu modülün üzerinde yer aldığı paylaşılan kitaplıkların modüllerinin listesidir. çalışma zamanına bağlıdır. Bu bilgi, bağlantı anında ve ilgili bilgileri içeren bir dosyayı Google'a ekleyin.
YEREL_WHOLE_STATIC_KİTAPLIKLAR
Bu değişken, LOCAL_STATIC_LIBRARIES
işlevinin bir varyantıdır ve
bağlayıcı, ilişkili kitaplık modüllerini tüm arşivler olarak işlemelidir. Örneğin,
daha fazla bilgi edinmek için GNU ld dokümanlarına bakın
--whole-archive
işareti.
Bu değişken, birkaç kullanıcı arasında döngüsel bağımlılıklar olduğunda işe yarar. olması gerekir. Paylaşılan bir kitaplık oluşturmak için bu değişkeni kullandığınızda derleme sistemini, statik kitaplıklarınızdaki tüm nesne dosyalarını iki kat daha fazla belirir. Ancak yürütülebilir dosyalar oluşturulurken bu durum geçerli değildir.
LOCAL_LDLIBS
Bu değişken, binada kullanılan ek bağlayıcı flag'lerinin listesini içerir
paylaşılan kitaplığınızda veya yürütülebilir dosyalarda görünür. -l
ön ekini kullanarak
belirli sistem kitaplıklarının adını yazın. Örneğin, aşağıdaki örnekte
yükleme sırasında /system/lib/libz.so
ile bağlantı kuran bir modül oluşturmak için bağlayıcıyı
zaman:
LOCAL_LDLIBS := -lz
Bu NDK'da bağlantı oluşturabileceğiniz, açığa çıkmış sistem kitaplıklarının listesi için sürümü için Yerel API'ler bölümüne bakın.
YEREL_LDFLAGS
Derleme sisteminizin derleme sırasında kullanacağı, derleme sistemi için
paylaşılan kitaplık veya yürütülebilir dosya. Örneğin, ld.bfd
bağlayıcısını şurada kullanmak için:
ARM/X86:
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
Derleme sistemi tanımlanmamış bir referansla karşılaştığında varsayılan olarak paylaşılan bir değer oluşturmaya çalışırken tanımsız sembol hatası atar. Bu hatası, kaynak kodunuzdaki hataları yakalamanıza yardımcı olabilir.
Bu kontrolü devre dışı bırakmak için değişkeni true
olarak ayarlayın. Bu ayarın
paylaşılan kitaplığın çalışma zamanında yüklenmesine neden olur.
YEREL_ARM_MODU
Derleme sistemi, varsayılan olarak thumb modunda ARM hedef ikili programları oluşturur.
Bu yöntemde her talimat 16 bit genişliğinde olur ve
thumb/
dizini. Bu değişkenin arm
olarak tanımlanması, derleme sistemini
modülün nesne dosyalarını 32 bit arm
modunda oluşturur. Aşağıdaki örnek
bunun nasıl yapılacağını gösterir:
LOCAL_ARM_MODE := arm
Ayrıca, derleme sistemine arm
ürününde yalnızca belirli kaynakları derleyecek şekilde talimat verebilirsiniz
kaynak dosya adlarına .arm
son eki ekleyerek modunuza uygulayabilirsiniz. Örneğin,
Aşağıdaki örnek, derleme sistemine bar.c
öğesini her zaman ARM modunda derlemesini söyler,
ancak LOCAL_ARM_MODE
değerine göre foo.c
oluşturmak için kullanılır.
LOCAL_SRC_FILES := foo.c bar.c.arm
LOCAL_ARM_NEON
Bu değişken yalnızca armeabi-v7a
ABI'sini hedeflediğinizde önemlidir. Google
C ve C++ uygulamalarınızda ARM Advanced SIMD (NEON) derleyici yerleşik özelliklerinin kullanılmasına olanak tanır
ve Assembly dosyalarındaki NEON talimatlarını içerir.
Tüm ARMv7 tabanlı CPU'ların NEON talimat grubu uzantılarını desteklemediğini unutmayın. Bu nedenle, dosyayı güvenli bir şekilde kullanabilmek için çalışma zamanı algılamayı bu kodu girmeniz gerekir. Daha fazla bilgi için Neon destek sayfasına bakın ve CPU özellikleri.
Alternatif olarak, .neon
sonekini kullanarak derleme sisteminin
NEON desteğiyle yalnızca belirli kaynak dosyaları derleyin. Aşağıdaki örnekte,
derleme sistemi, foo.c
öğesini baş ve neon desteğiyle, bar.c
öğesini ise
baş parmak desteği ve ARM ve NEON desteğiyle zoo.c
:
LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
Her iki soneki de kullanırsanız .arm
, .neon
tarihinden önce gelmelidir.
LOCAL_DISABLE_FORMAT_STRING_checkS
Derleme sistemi, varsayılan olarak kodu biçim dizesi korumasıyla derler. Yapmak
Bu nedenle,
printf
stili işlev. Bu koruma varsayılan olarak açıktır, ancak isterseniz devre dışı bırakabilirsiniz
bu değişkenin değerini true
olarak ayarlayarak bunu görebilirsiniz. Bunu yapmanızı önermiyoruz
bir nedeni olabilir.
YEREL_DIŞA_AKIŞ_CFLAGS
Bu değişken, LOCAL_CFLAGS
öğesine eklenecek bir dizi C/C++ derleyici işareti kaydeder
kullanan diğer modüllerin tanımlarını
LOCAL_STATIC_LIBRARIES
veya LOCAL_SHARED_LIBRARIES
değişkenleri.
Örneğin, şu modül çiftlerini ele alalım: foo
ve bar
.
foo
öğesine bağlıdır:
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLAGS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
Burada, derleme sistemi -DFOO=1
ve -DBAR=2
işaretlerini derleyiciye iletir
bar.c
oluşturun. Ayrıca, dışa aktarılan işaretleri modülünüzün başına
Bunları kolayca geçersiz kılabilmeniz için LOCAL_CFLAGS
.
Ayrıca, modüller arasındaki ilişki geçişlidir: zoo
bar
, bu da foo
değerine bağlıdır, ardından zoo
de tüm işaretleri devralır
foo
kaynağından dışa aktarıldı.
Son olarak, derleme sistemi yerel olarak derleme yaparken dışa aktarılan işaretleri kullanmaz
(yani, işaretlerini dışa aktardığı modülü derleme). Dolayısıyla,
yukarıda belirtilenden, foo/foo.c
derleme sırasında -DFOO=1
öğesini derleyiciye iletmez. Alıcı:
yerel olarak derlemek yerine LOCAL_CFLAGS
kullanın.
YEREL_DIŞA AKTAR_ÇALIŞAN_PAZARLAMALAR
Bu değişken LOCAL_EXPORT_CFLAGS
ile aynıdır, ancak yalnızca C++ işaretleri için geçerlidir.
YEREL_DIŞA_AKIŞ_C_DAHİL
Bu değişken LOCAL_EXPORT_CFLAGS
ile aynıdır ancak C için yolları içerir. Google
Örneğin, bar.c
öğesinin üstbilgilerini içermesi gerektiği durumlarda yararlıdır:
foo
modülü.
YEREL_DIŞA_AKIŞ_LDFLAGS
Bu değişken LOCAL_EXPORT_CFLAGS
ile aynıdır ancak bağlayıcı işaretleri içindir.
YEREL_EXPORT_LDLIBS
Bu değişken LOCAL_EXPORT_CFLAGS
ile aynıdır ve derleme sistemine
belirli sistem kitaplıklarının adlarını derleyiciye iletir. Başına -l
ekle
adını yazın.
Derleme sisteminin içe aktarılan bağlayıcı işaretlerini
modülünün LOCAL_LDLIBS
değişkeni Unix bağlayıcılarının çalışma şeklinden dolayı bunu yapar.
Bu değişken genellikle foo
modülü statik bir kitaplık olduğunda ve
sistem kitaplığına bağlı bir kod içerir. Ardından LOCAL_EXPORT_LDLIBS
ile şunları yapabilirsiniz:
dışa aktaracağız. Örnek:
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
Bu örnekte, derleme sistemi bağlayıcı komutunun sonuna -llog
komutunu yerleştiriyor
libbar.so
derlendiğinde. Bu işlemle, bağlayıcı bunu belirtir. Çünkü libbar.so
foo
değerine bağlıdır. Sistem günlük kaydı kitaplığına da bağlıdır.
LOCAL_SHORT_COMMANDS
Modülünüzde çok fazla kaynak olduğunda bu değişkeni true
olarak ayarlayın
ve/veya bağımlı statik ya da paylaşılan kitaplıklar. Bu, derleme sistemini
ara nesne dosyaları veya bağlantı içeren arşivler için @
söz dizimini kullanın
kitaplıklar.
Bu özellik, komut satırının maksimum 8191 karakterden oluşmalıdır. Bu boyut, karmaşık projeler için çok küçük olabilir. Aynı zamanda tek tek kaynak dosyaların derlenmesini etkiler ve neredeyse tüm derleyiciler işaretleri de içerir.
true
dışındaki değerlerin varsayılan davranışa geri döneceğini unutmayın. Siz
zorlamak için Application.mk
dosyanızda APP_SHORT_COMMANDS
tanımlayabilirsiniz
bu davranışı projenizdeki tüm modüller için geçerli hale getirir.
Derlemenin daha hızlı yüklenmesini sağladığından bu özelliğin varsayılan olarak etkinleştirilmesini önermiyoruz daha yavaş.
LOCAL_THIN_ARCHIVE
Statik kitaplıklar oluştururken bu değişkeni true
olarak ayarlayın. Bu işlemle
ince bir arşiv, yani nesne dosyaları içermeyen bir kitaplık dosyası oluşturun.
Bunun yerine, normalde yalnızca görüntüleyeceğimiz gerçek nesnelerin dosya yollarını,
emin olun.
Bu, derleme çıktınızın boyutunu azaltma açısından yararlıdır. Dezavantajı ise bu tür kitaplıklar farklı bir konuma (içindeki tüm yollar) taşınamaz görecelidir).
Geçerli değerler true
, false
veya boş değerlerdir.
APP_THIN_ARCHIVE
değişkeni üzerinden Application.mk
dosyasını yükleyebilirsiniz.
LOCAL_FİLTRE_ASM
Bu değişkeni, derleme sisteminin filtrelemek için kullanacağı kabuk komutu olarak tanımlayın
belirttiğiniz dosyalardan ayıklanan veya oluşturulan derleme dosyaları
LOCAL_SRC_FILES
Bu değişkenin tanımlanması, aşağıdaki durumların oluşmasına neden olur:
- Derleme sistemi herhangi bir C veya C++ kaynağından geçici bir derleme dosyası oluşturur dosyası olarak derleyebilirsiniz.
- Derleme sistemi, kabuk komutunu
LOCAL_FILTER_ASM
projesindeLOCAL_SRC_FILES
dizininde listelenen herhangi bir derleme dosyasında, oluşturarak başka bir geçici derleme dosyası oluşturabilirsiniz. - Derleme sistemi, filtrelenmiş bu derleme dosyalarını bir nesne dosyasında derler.
Örnek:
LOCAL_SRC_FILES := foo.c bar.S
LOCAL_FILTER_ASM :=
foo.c --1--> $OBJS_DIR/foo.S.original --2--> $OBJS_DIR/foo.S --3--> $OBJS_DIR/foo.o
bar.S --2--> $OBJS_DIR/bar.S --3--> $OBJS_DIR/bar.o
"1" "2" derleyiciye karşılık gelir ekleyin ve "3" geri dönelim. Filtre, girişin adını alan bağımsız bir kabuk komutu olmalıdır dosyasını ilk bağımsız değişkeni olarak, çıkış dosyasının adını ise ikinci bağımsız değişken olarak kullanabilirsiniz. Örnek:
myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
myasmfilter bar.S $OBJS_DIR/bar.S
NDK tarafından sağlanan işlev makroları
Bu bölümde, NDK'nın sağladığı GNU Make işlevi makroları açıklanmaktadır. Tekliflerinizi otomatikleştirmek ve optimize etmek için
Değerlendirmek için $(call <function>)
; metinsel bilgiler döndürürler.
benim-diz
Bu makro, eklenen son Makefile yolunu döndürür. Bu yöntem genellikle
mevcut Android.mk
dizini. my-dir
, şunun tanımlanması için yararlıdır:
Android.mk
dosyanızın başında LOCAL_PATH
. Örnek:
LOCAL_PATH := $(call my-dir)
GNU Make'sinin çalışma şekli nedeniyle bu makronun gerçekte döndürdüğü şey,
derleme sisteminin derleme komut dosyalarını ayrıştırırken eklediği son oluşturma dosyası. Örneğin,
Bu nedenle, başka bir dosya ekledikten sonra my-dir
öğesini çağırmamalısınız.
Örneğin, aşağıdaki örneği ele alalım:
LOCAL_PATH := $(call my-dir)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(call my-dir)
# ... declare another module
Buradaki sorun, my-dir
için yapılan ikinci çağrının LOCAL_PATH
öğesini
$PATH
yerine $PATH/foo
, çünkü en son
tıklayın.
Diğer her şeyden sonra ek eklemeler yaparak bu sorunu önleyebilirsiniz.
Android.mk
dosyasında bulabilirsiniz. Örnek:
LOCAL_PATH := $(call my-dir)
# ... declare one module
LOCAL_PATH := $(call my-dir)
# ... declare another module
# extra includes at the end of the Android.mk file
include $(LOCAL_PATH)/foo/Android.mk
Dosyayı bu şekilde yapılandırmak mümkün değilse
ilk my-dir
çağrısı başka bir değişkene dönüştürülür. Örnek:
MY_LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(MY_LOCAL_PATH)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(MY_LOCAL_PATH)
# ... declare another module
tüm-subdir-makefiles
Şu öğenin tüm alt dizinlerinde bulunan Android.mk
dosyalarının listesini döndürür:
mevcut my-dir
yolu.
Bu işlevi, derin iç içe yerleştirilmiş kaynak dizin hiyerarşileri sağlamak için kullanabilirsiniz.
inceleyeceğiz. Varsayılan olarak, NDK yalnızca dizindeki dosyaları arar.
Android.mk
dosyasını içeren dosyalar.
bu-yapım dosyası
Geçerli oluşturma dosyasının yolunu döndürür (derleme sistemi tarafından işlevi) kullanabilirsiniz.
üst-yapı dosyası
Dahil etme ağacındaki üst oluşturma dosyasının yolunu ( hazır dosyayı da içerir.
büyük-ana-yapı-dosyası
Dahil etme ağacındaki ( dosyayı tekrar yükleyebilirsiniz.
içe aktarma modülü
Bir modülün Android.mk
dosyasını bulup dahil etmenize olanak tanıyan
modülün adını yazın. Aşağıda tipik bir örnek verilmiştir:
$(call import-module,<name>)
Bu örnekte, derleme sistemi aşağıdaki kodda <name>
etiketli modülü
NDK_MODULE_PATH
ortamınıza referans veren dizinlerin listesi
değişkenine referansta bulunur ve Android.mk
dosyasını sizin için otomatik olarak ekler.