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.
Aperçu
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.