Der NDK bietet offizielle Unterstützung für ndk-build und CMake. Die meisten Nutzer sollten einen dieser Leitfäden zum Erstellen von Anwendungscode zurate ziehen. In diesem Dokument wird beschrieben, wie Sie vorhandenen Code erstellen, der andere Build-Systeme verwendet. Dies ist häufig bei Abhängigkeiten von Drittanbietern der Fall, die nicht Android-spezifisch sind, z. B. OpenSSL und libbzip2.
Build-Systemadministratoren, die ihren Build-Systemen native NDK-Unterstützung hinzufügen möchten, sollten stattdessen den Leitfaden für Build System Verwalter lesen.
Übersicht
Der Clang-Compiler im NDK kann mit nur minimaler Konfiguration verwendet werden, um Ihre Zielumgebung zu definieren.
Übergeben Sie beim Aufrufen von Clang entweder das entsprechende Ziel mit -target
oder rufen Sie den Clang mit dem Ziel-Präfix auf, damit die Erstellung für die richtige Architektur erfolgt. Um beispielsweise für die 64-Bit-ARM-Android-Version mit einem minSdkVersion
von 21 zu kompilieren, kannst du eine der folgenden Optionen verwenden, die für dich am besten geeignet sind:
$ $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
Ersetzen Sie in beiden Fällen $NDK
durch den Pfad zum NDK und $HOST_TAG
, um dem heruntergeladenen NDK gemäß der folgenden Tabelle zu entsprechen:
NDK-Betriebssystemvariante | Host-Tag |
---|---|
macOS | darwin-x86_64 |
Linux | linux-x86_64 |
64-Bit-Windows | windows-x86_64 |
Das Format des Präfix- oder Zielarguments ist hier das Ziel-Dreifach mit einem Suffix, das minSdkVersion
angibt. Dieses Suffix wird nur mit clang/clang++ verwendet. Die binutils-Tools (z. B. ar
und strip
) benötigen kein Suffix, da sie von minSdkVersion
nicht betroffen sind. Folgende Zieldreifachwerte werden von Android unterstützt:
ABI | Triple |
---|---|
Armeabi-V7a | armv7a-linux-androideabi |
ARM64-V8a | aarch64-linux-android |
x86 | i686-linux-android |
x86–64 | x86_64-linux-android |
In den Build-Scripts vieler Projekte werden Cross-Compiler im GCC-Stil erwartet, bei denen jeder Compiler nur auf eine Kombination aus Betriebssystem und Architektur ausgerichtet ist und -target
daher möglicherweise nicht ordnungsgemäß verarbeitet wird. In diesen Fällen können Sie normalerweise das Argument -target
in die Compilerdefinition aufnehmen (z.B. CC="clang -target
aarch64-linux-android21
) oder die Clang-Binärdateien mit dreifachem Präfix verwenden.
Automatische Konfiguration
Mit Autoconf-Projekten können Sie die Toolchain angeben, die mit Umgebungsvariablen verwendet werden soll. Das folgende Beispiel zeigt, wie libpng
für Android x86-64 mit einem minSdkVersion
von API-Level 21 unter Linux erstellt wird.
# 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
Die in diesem Beispiel ausgewählten Tools sind für NDK r22 und höher geeignet. Ältere NDKs erfordern möglicherweise andere Tools.
Erstellen von Projekten ohne Autoconf
Einige Makefile-Projekte ermöglichen die Kreuzkompilierung, indem dieselben Variablen überschrieben werden wie bei einem Autoconf-Projekt. Das folgende Beispiel zeigt, wie libbzip2
für Android x86-64 mit einem minSdkVersion
von 21 erstellt wird.
# 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
Die in diesem Beispiel ausgewählten Tools sind für NDK r22 und höher geeignet. Ältere NDKs erfordern möglicherweise andere Tools.