L'NDK contiene il supporto ufficiale per ndk-build e CMake. La maggior parte degli utenti dovrebbe consultare una di queste guide per la creazione del codice dell'applicazione. Lo scopo di questo documento è descrivere come creare codice esistente che utilizza altri sistemi di compilazione. Questo si verifica spesso nel caso di dipendenze di terze parti non specifiche di Android, come OpenSSL e libbzip2.
I manutentori di sistema build che vogliono aggiungere il supporto NDK nativo ai sistemi di build dovrebbero invece leggere la guida per i manutentori di sistemi di build.
Panoramica
Il compilatore Clang nell'NDK è utilizzabile con una configurazione minima necessaria per definire l'ambiente di destinazione.
Per assicurarti di creare l'architettura corretta, passa la destinazione appropriata con -target
quando richiami il clang oppure richiama il clang con prefisso target. Ad esempio, per la compilazione di un sistema Android ARM a 64 bit con un valore minSdkVersion
pari a 21, è sufficiente una delle due opzioni riportate di seguito e puoi utilizzare quella che ritieni più comoda:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
-target aarch64-linux-android21 foo.cpp
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
foo.cpp
In entrambi i casi, sostituisci $NDK
con il percorso dell'NDK e di $HOST_TAG
in modo che corrisponda all'NDK scaricato in base alla seguente tabella:
Variante sistema operativo NDK | Tag host |
---|---|
macOS | darwin-x86_64 |
Linux | linux-x86_64 |
Windows a 64 bit | windows-x86_64 |
Il formato del prefisso o dell'argomento target è il triplo di destinazione con un suffisso che indica minSdkVersion
. Questo suffisso viene utilizzato solo con clang/clang++. Gli strumenti binutils (come ar
e strip
) non richiedono un suffisso perché non sono interessati da minSdkVersion
. Le triple target supportate da Android sono i seguenti:
ABI | Triplo |
---|---|
armeabi-v7a | armv7a-linux-androideabi |
ARM64-V8A | aarch64-linux-android |
x86 | i686-linux-android |
x86-64 | x86_64-linux-android |
Per gli script di build di molti progetti è previsto un cross compilatore in stile GCC, dove ciascun compilatore ha come target una sola combinazione di sistema operativo/architettura e, di conseguenza, potrebbe non gestire -target
in modo pulito. In questi casi, in genere puoi includere l'argomento -target
nella definizione del compilatore (ad es. CC="clang -target
aarch64-linux-android21
) oppure utilizzare i programmi binari Clang con triplo prefisso.
Configurazione automatica
I progetti Autoconf consentono di specificare la Toolchain da utilizzare con le variabili di ambiente. Ad esempio, quanto segue mostra come creare libpng
per Android x86-64 con minSdkVersion
del livello API 21 su Linux.
# Check out the source. git clone https://github.com/glennrp/libpng -b v1.6.37 cd libpng
# Only choose one of these, depending on your build machine... export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64 export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device... export TARGET=aarch64-linux-android export TARGET=armv7a-linux-androideabi export TARGET=i686-linux-android export TARGET=x86_64-linux-android
# Set this to your minSdkVersion. export API=21
# Configure and build. export AR=$TOOLCHAIN/bin/llvm-ar export CC=$TOOLCHAIN/bin/$TARGET$API-clang export AS=$CC export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++ export LD=$TOOLCHAIN/bin/ld export RANLIB=$TOOLCHAIN/bin/llvm-ranlib export STRIP=$TOOLCHAIN/bin/llvm-strip ./configure --host $TARGET make
Gli strumenti selezionati in questo esempio sono corretti per NDK r22 e versioni successive. I NDK meno recenti potrebbero richiedere strumenti diversi.
Crea progetti senza configurazione automatica
Alcuni progetti makefile consentono la compilazione incrociata mediante l'override delle stesse variabili utilizzate da un progetto autoconf. Ad esempio, quanto riportato di seguito mostra come creare libbzip2
per Android x86-64 con minSdkVersion
pari a 21.
# Check out the source.
git clone https://gitlab.com/bzip/bzip2.git
cd bzip2
# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android
# Set this to your minSdkVersion.
export API=21
# Build.
make \
CC=$TOOLCHAIN/bin/$TARGET$API-clang \
AR=$TOOLCHAIN/bin/llvm-ar \
RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
bzip2
Gli strumenti selezionati in questo esempio sono corretti per NDK r22 e versioni successive. I NDK meno recenti potrebbero richiedere strumenti diversi.