In questa pagina viene descritta la sintassi del file di build Android.mk
utilizzato da
ndk-build
.
Panoramica
Il file Android.mk
si trova in una sottodirectory della proprietà jni/
del progetto
e descrive le origini e le librerie condivise nel sistema di compilazione.
Si tratta in realtà di un piccolo frammento del file di makefile GNU che il sistema di compilazione analizza una volta o
altro ancora. Il file Android.mk
è utile per definire impostazioni a livello di progetto che
Application.mk
, il sistema di compilazione e le variabili di ambiente lasciano
non definito. Può anche sostituire le impostazioni a livello di progetto per moduli specifici.
La sintassi dell'Android.mk
consente di raggruppare le origini in moduli.
Un modulo è una libreria statica, una libreria condivisa o una libreria indipendente
eseguibile. Puoi definire uno o più moduli in ogni file Android.mk
e
puoi utilizzare lo stesso file di origine in più moduli. Solo il sistema di compilazione
delle librerie condivise nel pacchetto dell'applicazione. Inoltre, il traffico
delle librerie possono generare librerie condivise.
Oltre alla pacchettizzazione delle librerie, il sistema di compilazione gestisce una varietà di altri
i dettagli per te. Ad esempio, non è necessario elencare file di intestazione o
delle dipendenze tra i file generati nel file Android.mk
. La build NDK
il sistema elabora automaticamente queste relazioni. Di conseguenza,
dovrebbe poter beneficiare del supporto di una nuova catena di strumenti/piattaforma nel futuro NDK
senza dover modificare il file Android.mk
.
La sintassi di questo file è molto simile a quella utilizzata nei file Android.mk
distribuiti con l'intero progetto open source Android. Mentre il sistema di compilazione
che l'implementazione è diversa, la loro somiglianza è una scelta intenzionale
decisione di progettazione finalizzata a semplificare il riutilizzo da parte degli sviluppatori di applicazioni
per le librerie esterne.
Nozioni di base
Prima di esplorare la sintassi in dettaglio, è utile iniziare con la comprensione
le nozioni di base su cosa contiene un file Android.mk
. In questa sezione vengono utilizzati i
Android.mk
nell'esempio Hello-JNI a questo scopo, che spiega il ruolo
riprodotta da ogni riga del file.
Un file Android.mk
deve iniziare a definire la variabile LOCAL_PATH
:
LOCAL_PATH := $(call my-dir)
Questa variabile indica la posizione dei file di origine all'interno
albero di Natale. In questo caso, la funzione macro my-dir
, fornita dal sistema di compilazione, restituisce
il percorso della directory corrente (la directory contenente Android.mk
file stesso).
La riga successiva dichiara la variabile CLEAR_VARS
, il cui valore è il sistema di compilazione
fornisce.
include $(CLEAR_VARS)
La variabile CLEAR_VARS
punta a uno speciale Makefile GNU che cancella molti
LOCAL_XXX
variabili per te, ad esempio LOCAL_MODULE
, LOCAL_SRC_FILES
e
LOCAL_STATIC_LIBRARIES
. Tieni presente che questa operazione non consente di cancellare LOCAL_PATH
. Questo
deve conservare il suo valore perché il sistema analizza tutti i file di controllo di build
in un singolo GNU, in cui tutte le variabili sono globali. Devi
(ri)dichiari questa variabile prima di descrivere ogni modulo.
La variabile LOCAL_MODULE
archivia quindi il nome del modulo che vuoi
creare. Utilizza questa variabile una volta per modulo nella tua applicazione.
LOCAL_MODULE := hello-jni
Ciascun nome di modulo deve essere univoco e non deve contenere spazi. Il sistema di compilazione,
quando genera il file finale della libreria condivisa, aggiunge automaticamente
prefisso e suffisso al nome che assegni a LOCAL_MODULE
. Ad esempio:
l'esempio riportato sopra genera la generazione di una libreria chiamata
libhello-jni.so
.
Nella riga successiva sono elencati i file di origine, con gli spazi che delimitano più file:
LOCAL_SRC_FILES := hello-jni.c
La variabile LOCAL_SRC_FILES
deve contenere un elenco di file di origine C e/o C++
in un modulo.
L'ultima riga consente al sistema di collegare tutti gli elementi:
include $(BUILD_SHARED_LIBRARY)
La variabile BUILD_SHARED_LIBRARY
rimanda a uno script GNU Makefile che
raccoglie tutte le informazioni che hai definito nelle variabili LOCAL_XXX
a partire dalla
include
recente. Questo script determina cosa creare e come farlo.
Ci sono esempi più complessi nelle directory di esempio, con
Android.mk
file che puoi esaminare. Inoltre, Esempio: attività nativa
fornisce una spiegazione dettagliata del file Android.mk
di questo campione. Infine,
Variabili e macro fornisce ulteriori informazioni sulle variabili di questo
.
Variabili e macro
Il sistema di compilazione fornisce molte possibili variabili da utilizzare nel file Android.mk
.
Molte di queste variabili sono fornite con valori preassegnati. Altre, tu assegna.
Oltre a queste variabili, puoi anche definirne di arbitrarie. In questo caso, mantieni tieni presente che il sistema di build NDK riserva i seguenti nomi di variabili:
- Nomi che iniziano con
LOCAL_
, ad esempioLOCAL_MODULE
. - Nomi che iniziano con
PRIVATE_
,NDK_
oAPP
. Il sistema di compilazione utilizza internamente. - Nomi in minuscolo, ad esempio
my-dir
. Il sistema di compilazione li utilizza internamente, beh.
Se devi definire le tue variabili di convenienza in un file Android.mk
,
consiglia di anteporre MY_
ai nomi.
Variabili di inclusione definite da NDK
Questa sezione illustra le variabili GNU Make definite dal sistema di compilazione
prima di analizzare il file Android.mk
. In determinate circostanze, l'NDK
potrebbe analizzare più volte il file Android.mk
, utilizzando una definizione diversa
per alcune di queste variabili.
CANCELLA_VAR
Questa variabile punta a uno script di build che non definisce quasi tutti i campi LOCAL_XXX
variabili elencate nella sezione "Variabili definite dallo sviluppatore" di seguito. Usa questa
per includere questo script prima di descrivere un nuovo modulo. La sintassi per
è:
include $(CLEAR_VARS)
CREA_ESECUZIONE
Questa variabile punta a uno script di build che raccoglie tutte le informazioni
il modulo che hai fornito nelle variabili LOCAL_XXX
e determina come
creare un eseguibile di destinazione dalle origini elencate. Tieni presente che l'utilizzo di
lo script richiede che tu abbia già assegnato valori a LOCAL_MODULE
e
Almeno LOCAL_SRC_FILES
(per ulteriori informazioni su queste variabili, consulta
variabili di descrizione del modulo).
La sintassi per l'utilizzo di questa variabile è:
include $(BUILD_EXECUTABLE)
CREA_LIBRERIA_CONDIVISA
Questa variabile punta a uno script di build che raccoglie tutte le informazioni
il modulo che hai fornito nelle variabili LOCAL_XXX
e determina come
Creare una libreria condivisa di destinazione dalle origini elencate. Tieni presente che l'utilizzo di
lo script richiede che tu abbia già assegnato valori a LOCAL_MODULE
e
Almeno LOCAL_SRC_FILES
(per ulteriori informazioni su queste variabili, consulta
variabili di descrizione del modulo).
La sintassi per l'utilizzo di questa variabile è:
include $(BUILD_SHARED_LIBRARY)
Una variabile della libreria condivisa fa sì che il sistema di compilazione generi un file della libreria
con un'estensione .so
.
LIBRERIA_STATIC_DI_CREAZIONE
Una variante di BUILD_SHARED_LIBRARY
utilizzata per creare una libreria statica. La
non copia le librerie statiche nel progetto/nei pacchetti, ma
possono utilizzarle per creare librerie condivise (vedi LOCAL_STATIC_LIBRARIES
e
LOCAL_WHOLE_STATIC_LIBRARIES
, di seguito). La sintassi per l'utilizzo di questa variabile è:
include $(BUILD_STATIC_LIBRARY)
Una variabile static-library fa sì che il sistema di compilazione generi una libreria con un
.a
.
LIBRERIA_CONDIVISA_PREBUILT
Punta a uno script di build utilizzato per specificare una libreria condivisa predefinita. Non mi piace in
nel caso di BUILD_SHARED_LIBRARY
e BUILD_STATIC_LIBRARY
, in questo caso il valore
LOCAL_SRC_FILES
non può essere un file di origine. Deve invece essere un unico percorso
una libreria condivisa predefinita, come foo/libfoo.so
. La sintassi per l'utilizzo di questo
è:
include $(PREBUILT_SHARED_LIBRARY)
Puoi anche fare riferimento a una libreria predefinita in un altro modulo utilizzando
Variabile LOCAL_PREBUILTS
. Per ulteriori informazioni sull'uso delle creatività predefinite,
Utilizza librerie predefinite.
LIBRERIA_STATIC_PREBUILT
Uguale a PREBUILT_SHARED_LIBRARY
, ma per una libreria statica predefinita. Per
Per saperne di più sull'utilizzo delle librerie predefinite, consulta Utilizzare le librerie predefinite.
Variabili di informazioni target
Il sistema di build analizza Android.mk
una volta per ogni ABI specificata dall'elemento APP_ABI
, solitamente definita nel file Application.mk
. Se APP_ABI
è all
, il sistema di build analizza Android.mk
una volta per ABI e l'NDK
Google Cloud. Questa sezione descrive le variabili definite dal sistema di compilazione ogni volta che viene
analizza Android.mk
.
ARCHIVIO_TARGET
La famiglia di CPU scelta come target dal sistema di compilazione durante l'analisi di questo Android.mk
. Questa variabile può essere una delle seguenti: arm
, arm64
, x86
o x86_64
.
PIATTAFORMA_TARGET
Il numero a livello di API Android scelto come target dal sistema di compilazione durante l'analisi.
Android.mk
. Ad esempio, le immagini di sistema Android 5.1 corrispondono
Livello API Android 22: android-22
. Per un elenco completo dei nomi delle piattaforme
immagini di sistema Android corrispondenti, vedi API native. La
nell'esempio seguente viene mostrata la sintassi per l'utilizzo di questa variabile:
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
TARGET_ARCH_ABI
L'ABI scelta come target dal sistema di compilazione durante l'analisi di questo file Android.mk
.
La tabella 1 mostra l'impostazione ABI utilizzata per ciascuna CPU e architettura supportate.
CPU e architettura | Impostazione |
---|---|
ARMv7 | armeabi-v7a |
ARMv8 AArch64 | arm64-v8a |
i686 | x86 |
x86-64 | x86_64 |
L'esempio seguente mostra come verificare ARMv8 AArch64 come target Combinazione di CPU e ABI:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# ... do something ...
endif
Per ulteriori dettagli sulle ABI dell'architettura e sui problemi di compatibilità associati, Fai riferimento alle ABI Android.
Le nuove ABI target in futuro avranno valori diversi.
TARGET_ABI
Una concatenazione del livello API Android target e dell'ABI. È particolarmente utile quando vuoi eseguire il test con un'immagine di sistema target specifica per un dispositivo reale. Ad esempio, per controllare un dispositivo ARM a 64 bit in esecuzione sul livello API Android 22:
ifeq ($(TARGET_ABI),android-22-arm64-v8a)
# ... do something ...
endif
Variabili di descrizione del modulo
Le variabili in questa sezione descrivono il modulo al sistema di compilazione. Ciascuna la descrizione del modulo deve seguire questo flusso di base:
- Inizializza o non definisci le variabili associate al modulo utilizzando il metodo
Variabile
CLEAR_VARS
. - Assegna i valori alle variabili utilizzate per descrivere il modulo.
- Imposta il sistema di compilazione NDK in modo che utilizzi lo script di build appropriato per il modulo.
utilizzando la variabile
BUILD_XXX
.
PERCORSO LOCALE
Questa variabile viene utilizzata per fornire il percorso del file corrente. Devi definirlo
all'inizio del tuo file Android.mk
. L'esempio seguente mostra come fare
quindi:
LOCAL_PATH := $(call my-dir)
Lo script a cui punta CLEAR_VARS
non cancella questa variabile. Pertanto,
devi definirla una sola volta, anche se il tuo file Android.mk
descrive più moduli.
MODULO_LOCALE
Questa variabile memorizza il nome del modulo. Deve essere univoco tra tutti i moduli
e non devono contenere spazi. Devi definirlo prima di includere qualsiasi
(diverso da quello relativo a CLEAR_VARS
). Non è necessario aggiungere lib
o l'estensione del file .so
o .a
. il sistema di compilazione
le modifiche in modo automatico. In Android.mk
e Application.mk
file, fai riferimento al modulo usando il nome non modificato. Ad esempio,
riga genera un modulo della libreria condivisa denominato libfoo.so
:
LOCAL_MODULE := "foo"
Se vuoi che il modulo generato abbia un nome diverso da lib
+ il valore di
LOCAL_MODULE
, puoi utilizzare la variabile LOCAL_MODULE_FILENAME
per assegnare
per il modulo generato con un nome a tua scelta.
LOCAL_MODULE_FILENAME
Questa variabile facoltativa consente di ignorare i nomi assegnati al sistema di compilazione
utilizza per impostazione predefinita per i file che genera. Ad esempio, se il nome del tuo
LOCAL_MODULE
è foo
, puoi forzare il sistema a chiamare il file che genera
libnewfoo
. L'esempio seguente mostra come eseguire questa operazione:
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
Per un modulo della Libreria condivisa, questo esempio genera un file denominato
libnewfoo.so
.
LOCAL_SRC_FILES
Questa variabile contiene l'elenco dei file di origine che il sistema di compilazione utilizza per
generare il modulo. Elenca solo i file effettivamente trasmessi dal sistema di compilazione
al compilatore, dato che il sistema di compilazione calcola automaticamente eventuali
delle dipendenze. Tieni presente che puoi utilizzare sia valori relativi (per LOCAL_PATH
) che assoluti
per i file YAML.
Consigliamo di evitare percorsi di file assoluti, per i percorsi relativi, Android.mk
portabilità del file.
LOCAL_CPP_EXTENSION
Puoi utilizzare questa variabile facoltativa per indicare un'estensione del file diversa da
.cpp
per i file sorgente C++. Ad esempio, la riga seguente modifica
estensione a .cxx
. L'impostazione deve includere il punto.
LOCAL_CPP_EXTENSION := .cxx
Puoi utilizzare questa variabile per specificare più estensioni. Ad esempio:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPP_FEATURES
Puoi utilizzare questa variabile facoltativa per indicare che il codice si basa su specifiche
C++. Abilita i flag corretti del compilatore e del linker durante la build
e il processo di sviluppo. Per i file binari predefiniti, questa variabile dichiara anche quali caratteristiche
dipende dal file binario e ciò contribuisce a garantire il corretto funzionamento del collegamento finale. Me
consigliamo di utilizzare questa variabile anziché attivare -frtti
e
-fexceptions
direttamente nella definizione di LOCAL_CPPFLAGS
.
L'uso di questa variabile consente al sistema di compilazione di usare i flag appropriati per
in ogni modulo. L'uso di LOCAL_CPPFLAGS
fa sì che il compilatore utilizzi tutte le risorse specificate
per tutti i moduli, indipendentemente dalle esigenze effettive.
Ad esempio, per indicare che il codice utilizza RTTI (RunTime Type Information), Scrivi:
LOCAL_CPP_FEATURES := rtti
Per indicare che il codice utilizza eccezioni C++, scrivi:
LOCAL_CPP_FEATURES := exceptions
Per questa variabile puoi anche specificare più valori. Ad esempio:
LOCAL_CPP_FEATURES := rtti features
L'ordine in cui descrivi i valori non è importante.
LOCAL_C_INCLUDES
Puoi utilizzare questa variabile facoltativa per specificare un elenco di percorsi relativi
Directory NDK root
, da aggiungere al percorso di ricerca di inclusione durante la compilazione di tutte
(C, C++ e Assembly). Ad esempio:
LOCAL_C_INCLUDES := sources/foo
Oppure:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
Definisci questa variabile prima di impostare eventuali flag di inclusione corrispondenti tramite
LOCAL_CFLAGS
o LOCAL_CPPFLAGS
.
Il sistema di compilazione utilizza automaticamente anche LOCAL_C_INCLUDES
percorsi all'avvio
il debug nativo con ndk-gdb.
CFLAG LOCALI
Questa variabile facoltativa imposta i flag del compilatore che il sistema di compilazione deve passare quando
creare file sorgente C e C++. Questa possibilità può essere utile a
che specifica ulteriori definizioni di macro o opzioni di compilazione. Usa LOCAL_CPPFLAGS
per specificare flag solo per C++.
Cerca di non modificare il livello di ottimizzazione/debug nel file Android.mk
.
Il sistema di compilazione è in grado di gestire automaticamente questa impostazione, utilizzando
le informazioni pertinenti nel file Application.mk
. In questo modo
per generare file di dati utili utilizzati durante il debug.
È possibile specificare percorsi di inclusione aggiuntivi scrivendo:
LOCAL_CFLAGS += -I<path>,
È comunque meglio utilizzare LOCAL_C_INCLUDES
a questo scopo, dato che
rende possibile l'utilizzo dei percorsi disponibili per il debug nativo con
ndk-gdb.
CPPFLAG LOCALI
Set facoltativo di flag del compilatore che verranno passati durante la creazione dell'origine C++
solo file. Verranno visualizzati dopo il LOCAL_CFLAGS
nella barra
dalla riga di comando. Usa LOCAL_CFLAGS
per specificare i flag sia per C che per C++.
LIBRERIE_STATICHE_LOCALI
Questa variabile archivia l'elenco dei moduli delle librerie statiche in cui l'attuale dipende dal modulo.
Se il modulo corrente è una libreria condivisa o un eseguibile, questa variabile forzare il collegamento di queste librerie nel file binario risultante.
Se il modulo corrente è una libreria statica, questa variabile indica semplicemente che gli altri moduli, a seconda di quello attuale, dipenderanno anche dalla configurazione librerie.
LIBRERIE_LOCAL_SHARED_LIBRARI
Questa variabile è l'elenco dei moduli delle librerie condivise in cui questo modulo dipende dal runtime. Queste informazioni sono necessarie al momento del collegamento e per incorporare il le informazioni corrispondenti nel file generato.
LIBRERIE_STATICHE_INTERE_LOCALI
Questa variabile è una variante di LOCAL_STATIC_LIBRARIES
ed esprime il fatto che la variabile
il linker deve considerare i moduli della biblioteca associati come interi archivi. Per
ulteriori informazioni su interi archivi, consulta la documentazione di GNU ld per i
Flag --whole-archive
.
Questa variabile è utile quando ci sono dipendenze circolari tra diversi librerie statiche. Quando utilizzi questa variabile per creare una libreria condivisa, questa costringe il sistema di compilazione ad aggiungere tutti i file oggetto delle librerie statiche alla binario finale. Lo stesso non è vero, però, quando si generano gli eseguibili.
LIBRE_LOCALI
Questa variabile contiene l'elenco dei flag del linker aggiuntivi da usare negli edifici
nella libreria condivisa o eseguibile. Ti consente di usare il prefisso -l
per trasmettere
il nome di librerie di sistema specifiche. Ad esempio, l'esempio seguente indica
il linker per generare un modulo che rimanda a /system/lib/libz.so
al caricamento
volta:
LOCAL_LDLIBS := -lz
Per l'elenco delle librerie di sistema esposte a cui puoi collegarti in questo NDK consulta la sezione API native.
FLAG_LOCALI
L'elenco di altri flag del linker che il sistema di compilazione può utilizzare durante la creazione
libreria condivisa o eseguibile. Ad esempio, per utilizzare il linker ld.bfd
su
ARM/X86:
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
Per impostazione predefinita, quando il sistema di compilazione rileva un riferimento non definito durante il tentativo di creare un elemento condiviso, visualizzerà un errore relativo a un simbolo non definito. Questo può aiutarti a individuare i bug nel codice sorgente.
Per disattivare questo controllo, imposta questa variabile su true
. Tieni presente che questa impostazione potrebbe
causa il caricamento della libreria condivisa in fase di runtime.
LOCAL_ARM_MODE
Per impostazione predefinita, il sistema di compilazione genera file binari di destinazione ARM in modalità thumb.
in cui ogni istruzione è larga 16 bit e collegata alle librerie STL del
Directory thumb/
. La definizione di questa variabile come arm
obbliga il sistema di compilazione a
generare i file oggetto del modulo in modalità arm
a 32 bit. Nell'esempio che segue
mostra come fare:
LOCAL_ARM_MODE := arm
Puoi anche indicare al sistema di compilazione di creare origini specifiche solo in arm
aggiungendo il suffisso .arm
ai nomi file di origine. Ad esempio,
l'esempio seguente indica al sistema di compilazione di compilare sempre bar.c
in modalità ARM,
ma creare foo.c
in base al valore di LOCAL_ARM_MODE
.
LOCAL_SRC_FILES := foo.c bar.c.arm
LOCAL_ARM_NEON
Questa variabile è importante solo se scegli come target l'ABI armeabi-v7a
. it
consente l'utilizzo dei componenti intrinseci del compilatore ARM Advanced SIMD (NEON) in C e C++
nonché le istruzioni NEON nei file Assembly.
Tieni presente che non tutte le CPU basate su ARMv7 supportano le estensioni del set di istruzioni NEON. Per questo motivo, devi eseguire un rilevamento del runtime per poter usare in sicurezza questo codice in fase di runtime. Per ulteriori informazioni, vedi Assistenza Neon e Funzionalità della CPU.
In alternativa, puoi utilizzare il suffisso .neon
per specificare che il sistema di compilazione
compilare solo file sorgente specifici con il supporto NEON. Nell'esempio seguente,
il sistema di compilazione compila foo.c
con il supporto per pollici e neon, bar.c
con
pollice e zoo.c
con supporto per ARM e NEON:
LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
Se utilizzi entrambi i suffissi, .arm
deve precedere .neon
.
LOCAL_DISABLE_FORMAT_STRING_CHECKS
Per impostazione predefinita, il sistema di compilazione compila il codice con la protezione da stringhe di formato. Attività
quindi forza un errore del compilatore se in una stringa di formato non costante viene utilizzata
Funzione di tipo printf
. Questa protezione è attiva per impostazione predefinita, ma puoi disattivarla
impostando il valore di questa variabile su true
. Sconsigliamo di farlo
senza un valido motivo.
ESPORTAZIONE_LOCALE_CFLAGS
Questa variabile registra un set di flag del compilatore C/C++ da aggiungere a LOCAL_CFLAGS
definizione di qualsiasi altro modulo che utilizzi questo tramite
Variabili LOCAL_STATIC_LIBRARIES
o LOCAL_SHARED_LIBRARIES
.
Ad esempio, considera la seguente coppia di moduli: foo
e bar
, che
dipende da foo
:
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)
Qui il sistema di compilazione passa i flag -DFOO=1
e -DBAR=2
al compilatore
durante la creazione di bar.c
. Inoltre, antepone i flag esportati al campo
LOCAL_CFLAGS
in modo da poterli facilmente sostituire.
Inoltre, la relazione tra i moduli è transitiva: se zoo
dipende da
bar
, che a sua volta dipende da foo
; anche zoo
eredita tutti i flag
esportato da foo
.
Infine, il sistema di compilazione non usa flag esportati quando crea in locale
(ovvero, la creazione del modulo di cui sta esportando i flag). Pertanto, nell'esempio
in alto, non passa -DFOO=1
al compilatore durante la creazione di foo/foo.c
. A
crea localmente, usa invece LOCAL_CFLAGS
.
ESPORTAZIONE_LOCALE_CPPFLAGS
Questa variabile è uguale a LOCAL_EXPORT_CFLAGS
, ma solo per i flag C++.
LOCAL_EXPORT_C_INCLUDES
Questa variabile è uguale a LOCAL_EXPORT_CFLAGS
, ma per C include i percorsi. it
è utile nei casi in cui, ad esempio, bar.c
deve includere intestazioni da
modulo foo
.
ESPORTAZIONE_LOCALIZZATA_LDFLAGS
Questa variabile è uguale a LOCAL_EXPORT_CFLAGS
, ma per i flag linker.
ESPORTAZIONE_LOCALIZZATA_LDLIB
Questa variabile è uguale a LOCAL_EXPORT_CFLAGS
e indica al sistema di compilazione di
passa i nomi di librerie di sistema specifiche al compilatore. Anteponi -l
al
di ogni libreria specificata.
Tieni presente che il sistema di compilazione aggiunge i flag del linker importati al valore del tuo
della variabile LOCAL_LDLIBS
del modulo. Ciò è dovuto al funzionamento dei linker Unix.
Questa variabile è in genere utile quando il modulo foo
è una libreria statica e ha
che dipende da una libreria di sistema. Dopodiché potrai utilizzare LOCAL_EXPORT_LDLIBS
per
per esportare la dipendenza. Ad esempio:
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)
In questo esempio, il sistema di compilazione inserisce -llog
alla fine del comando linker
quando crea libbar.so
. Questa operazione comunica al linker che, poiché libbar.so
dipende da foo
, dipende anche dalla libreria di logging di sistema.
LOCAL_SHORT_commandS
Imposta questa variabile su true
quando il modulo ha un numero molto elevato di fonti
e/o librerie statiche o condivise dipendenti. Questa operazione costringe il sistema di compilazione a
utilizza la sintassi @
per gli archivi contenenti link o file di oggetti intermedi
librerie.
Questa funzionalità può essere utile su Windows, dove la riga di comando accetta un di soli 8191 caratteri, che potrebbe essere troppo piccolo per progetti complessi. Inoltre, influisce sulla compilazione dei singoli file sorgente, posizionando quasi tutto il compilatore anche all'interno di file di elenco.
Tieni presente che qualsiasi valore diverso da true
tornerà al comportamento predefinito. Tu
puoi anche definire APP_SHORT_COMMANDS
nel file Application.mk
per forzare
questo comportamento per tutti i moduli del progetto.
Sconsigliamo di abilitare questa funzionalità per impostazione predefinita, poiché rende la build più lento.
ARCHIVIO_LOCALE_THIN
Imposta questa variabile su true
durante la creazione di librerie statiche. In questo modo
generare un archivio sottile, ovvero un file di libreria che non contiene file oggetto,
ma solo percorsi di file degli oggetti effettivi che normalmente
contengono.
Questo è utile per ridurre le dimensioni dell'output della build. Lo svantaggio è che Queste librerie non possono essere spostate in una posizione diversa (tutti i percorsi al loro interno sono relativi).
I valori validi sono true
, false
o vuoto. Puoi impostare un valore predefinito nel
Application.mk
tramite la variabile APP_THIN_ARCHIVE
.
LOCAL_FILTER_ASM
Definisci questa variabile come un comando shell che il sistema di compilazione utilizzerà per filtrare
i file assembly estratti o generati dai file specificati
LOCAL_SRC_FILES
. La definizione di questa variabile determina quanto segue:
- Il sistema di compilazione genera un file di assembly temporaneo da qualsiasi origine C o C++ anziché compilarli in un file oggetto.
- Il sistema di compilazione esegue il comando shell in
LOCAL_FILTER_ASM
su qualsiasi file di assembly temporaneo e su tutti i file di assembly elencati inLOCAL_SRC_FILES
, generando così un altro file di Assembly temporaneo. - Il sistema di compilazione compila questi file di assembly filtrati in un file oggetto.
Ad esempio:
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" corrisponde al compilatore "2" al filtro e "3" all'assemblatore. Il filtro deve essere un comando shell autonomo che prende il nome dell'input e il nome del file di output come secondo argomento. Ad esempio:
myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
myasmfilter bar.S $OBJS_DIR/bar.S
Macro di funzione fornite da NDK
Questa sezione spiega le macro delle funzioni GNU Make messe a disposizione dall'NDK. Utilizza le funzionalità di
$(call <function>)
per valutarli; restituiscono informazioni testuali.
mia-dir
Questa macro restituisce il percorso dell'ultimo makefile incluso, che in genere è
la directory di Android.mk
attuale. my-dir
è utile per definire
LOCAL_PATH
all'inizio del file Android.mk
. Ad esempio:
LOCAL_PATH := $(call my-dir)
Per via del funzionamento di GNU Make, la macro restituisce il percorso del
l'ultimo makefile incluso dal sistema di compilazione durante l'analisi degli script di build. Per
per questo motivo, non devi chiamare my-dir
dopo aver incluso un altro file.
Considera ad esempio il seguente:
LOCAL_PATH := $(call my-dir)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(call my-dir)
# ... declare another module
Il problema qui è che la seconda chiamata a my-dir
definisce LOCAL_PATH
come
$PATH/foo
anziché $PATH
, perché è qui che è stata inclusa la più recente
a punta.
Puoi evitare questo problema inserendo "include" dopo tutto il resto
nel file Android.mk
. Ad esempio:
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
Se non è possibile strutturare il file in questo modo, salva il valore del parametro
prima chiamata my-dir
in un'altra variabile. Ad esempio:
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
tutti-subdir-makefiles
Restituisce l'elenco di file Android.mk
situati in tutte le sottodirectory del
percorso my-dir
corrente.
Puoi utilizzare questa funzione per fornire gerarchie di directory di origine nidificate in modo approfondito
il sistema di compilazione. Per impostazione predefinita, NDK cerca solo i file presenti nella directory
contenente il file Android.mk
.
questo-makefile
Restituisce il percorso del makefile corrente (da cui il sistema di compilazione ha chiamato ).
principale-makefile
Restituisce il percorso del makefile padre nell'albero di inclusione (il percorso del makefile che includeva quello corrente).
fare-file-non-genitore
Restituisce il percorso del makefile principale nell'albero di inclusione (il percorso il makefile che includeva quello corrente).
modulo-importazione
Una funzione che ti consente di trovare e includere il file Android.mk
di un modulo tramite
il nome del modulo. Ecco un esempio tipico:
$(call import-module,<name>)
In questo esempio, il sistema di compilazione cerca il modulo con tag <name>
in
l'elenco di directory a cui viene fatto riferimento nell'ambiente NDK_MODULE_PATH
riferimenti alle variabili e include automaticamente il relativo file Android.mk
.