Usa l'NDK con altri sistemi di compilazione

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.