Utiliser le NDK avec d'autres systèmes de compilation

Le NDK est officiellement compatible avec ndk-build et CMake. La plupart des utilisateurs doivent se référer à l'un de ces guides pour créer le code d'application. L'objectif de ce document est de décrire comment compiler du code existant qui utilise d'autres systèmes de compilation. C'est souvent le cas des dépendances tierces qui ne sont pas spécifiques d'Android, comme OpenSSL et libbzip2.

Les personnes qui gèrent un système de compilation et souhaitent lui intégrer la compatibilité NDK native doivent plutôt consulter la page Build System Maintainers Guide.

Présentation

Le compilateur Clang du NDK est utilisable avec la configuration minimale requise pour définir votre environnement cible.

Pour vous assurer que votre build correspond à l'architecture adéquate, transmettez la cible appropriée avec -target lorsque vous appelez Clang, ou appelez Clang avec la cible en préfixe. Par exemple, si vous compilez un projet pour un système Android ARM 64 bits avec une minSdkVersion de 21, les deux extraits de code suivants fonctionnent. Vous pouvez utiliser celui qui vous convient le mieux :

$ $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

Dans les deux cas, remplacez $NDK par le chemin d'accès au NDK et définissez $HOST_TAG pour qu'il corresponde au NDK que vous avez téléchargé, conformément au tableau suivant :

Variante d'OS du NDK Balise d'hôte
macOS darwin-x86_64
Linux linux-x86_64
Windows 64 bits windows-x86_64

Le format du préfixe ou de l'argument cible correspond ici au triplet cible avec un suffixe indiquant la minSdkVersion. Ce suffixe n'est utilisé qu'avec clang/clang++. Les outils binutils (tels que ar et strip) ne nécessitent pas de suffixe, car ils ne sont pas affectés par la minSdkVersion. Les triplets cibles compatibles avec Android sont les suivants :

ABI Triplet
armeabi-v7a armv7a-linux-androideabi
arm64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android

Les scripts de compilation d'un grand nombre de projets prévoient des compilateurs croisés de type GCC, où chaque compilateur ne cible qu'une seule combinaison OS/architecture. Il est donc possible qu'ils ne gèrent pas correctement -target. Dans ce cas, vous pouvez généralement inclure l'argument -target dans la définition du compilateur (par exemple CC="clang -target aarch64-linux-android21) ou utiliser les binaires Clang avec le triplet en préfixe.

Autoconf

Les projets autoconf vous permettent de spécifier la chaîne d'outils à utiliser avec des variables d'environnement. L'exemple suivant montre comment compiler libpng pour Android x86-64 avec une minSdkVersion de niveau d'API 21, sous 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

Les outils sélectionnés dans cet exemple conviennent à NDK r22 ou version ultérieure. Les NDK plus anciens peuvent nécessiter des outils différents.

Projets make sans autoconf

Certains projets makefile autorisent la compilation croisée via le remplacement des mêmes variables que dans un projet autoconf. L'exemple suivant montre comment compiler libbzip2 pour Android x86-64 avec une minSdkVersion de 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

Les outils sélectionnés dans cet exemple conviennent à NDK r22 ou version ultérieure. Les NDK plus anciens peuvent nécessiter des outils différents.