Usa l'NDK con altri sistemi di compilazione

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.