NDK contiene il supporto ufficiale per ndk-build e CMake. La maggior parte degli utenti dovrebbe consulta una di queste guide per creare il codice dell'applicazione. Lo scopo di questo documento descrive come creare codice esistente che utilizza altre build sistemi diversi. Questo si verifica spesso con dipendenze di terze parti che non sono Specifici per Android, ad esempio OpenSSL e libbzip2.
Creare manutentori di sistema che vogliono aggiungere il supporto NDK nativo alla propria build devono leggere la Guida per i gestori del sistema di build.
Panoramica
Il compilatore clang nel file NDK è utilizzabile con una configurazione minima necessari per definire l'ambiente di destinazione.
Per assicurarti di creare l'architettura corretta, trasmetti i passaggi appropriati
scegliere il target con -target
quando richiami Clang. Ad esempio, per compilare i campi
ARM Android con minSdkVersion
di 21:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
--target aarch64-linux-android21 foo.cpp
In alternativa, esistono punti di ingresso con prefisso target per Clang. Potrebbero essere
tramite symlink o script che eseguono il clang, a seconda della release NDK
e il sistema operativo host. Richiamare direttamente Clang con --target
sarà più affidabile,
il flusso di lavoro più testato e a volte ci sono argomenti
di bug negli script. Su Windows, i CreateProcess
aggiuntivi necessari per l'inoltro
dallo script al compilatore reale potrebbe potenzialmente avere un
un impatto negativo sulla velocità della build.
$ $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 del valore $HOST_TAG
da far corrispondere
l'NDK scaricato in base alla tabella seguente:
Variante NDK OS | 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 qui è la tripla di destinazione con un
che indica minSdkVersion
. Questo suffisso viene utilizzato solo con
clang/clang++; gli strumenti binutils (come ar
e strip
) non richiedono un
perché non sono interessati da minSdkVersion
. Android supportato
le triple target 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 |
Molti progetti gli script di build prevedono cross-compilatori in stile GCC,
il compilatore ha come target una sola combinazione di sistema operativo/architettura e quindi potrebbe non gestire
-target
in modo pulito. In questi casi, in genere puoi includere -target
nella definizione del compilatore (ad es. CC="clang -target
aarch64-linux-android21
). Nei rari casi in cui il sistema di compilazione in uso
non in grado di utilizzare quel modulo, usa i file binari Clang con triplo prefisso.
Conf. automatica
I progetti Autoconf consentono di specificare la toolchain da utilizzare con l'ambiente
come la codifica one-hot
delle variabili categoriche. Ad esempio, quanto segue mostra come creare libpng
per Android
x86-64 con minSdkVersion
di 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/clang --target=$TARGET$API" export AS=$CC export CXX="$TOOLCHAIN/bin/clang++ --target=$TARGET$API" 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. NDK meno recenti potrebbero richiedere strumenti diversi.
Progetti di creazione non-autoconf
Alcuni progetti makefile consentono la compilazione incrociata eseguendo l'override delle stesse variabili
come con un progetto autoconf. Ad esempio, quanto segue mostra come
per sviluppare libbzip2
per Android x86-64 con un minSdkVersion
di 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/clang --target=$TARGET$API" \
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. NDK meno recenti potrebbero richiedere strumenti diversi.