Das NDK enthält offizielle Unterstützung für ndk-build und CMake. Die meisten Nutzenden sollten finden Sie in einem dieser Leitfäden zum Erstellen von Anwendungscode. Der Zweck der In diesem Dokument wird beschrieben, wie Sie vorhandenen Code erstellen, der andere Build- Systeme. Dies ist häufig der Fall, wenn Drittanbieterabhängigkeiten Android-spezifisch, z. B. OpenSSL und libbzip2
Systemverwalter, die ihren Build native NDK-Unterstützung hinzufügen möchten finden Sie im Build System Maintenanceers Guide (in englischer Sprache).
Übersicht
Der Clang-Compiler im NDK kann mit minimaler Konfiguration verwendet werden die zum Definieren der Zielumgebung erforderlich sind.
Um sicherzustellen, dass Sie die richtige Architektur erstellen, übergeben Sie
Ziel mit -target
beim Aufrufen von Clang. Um z. B. für 64-Bit-Versionen zu kompilieren,
ARM Android mit einem minSdkVersion
von 21:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
--target aarch64-linux-android21 foo.cpp
Alternativ gibt es für Clang Einstiegspunkte mit Zielpräfix. Dabei kann es sich um
entweder Symlinks oder Skripts, die zu Clang weiterleiten, je nach NDK-Version
und das Host-Betriebssystem. Der direkte Aufruf von Clang mit --target
ist zuverlässiger, da
Dies ist der am besten getestete Workflow. Gelegentlich gibt es
Fehler in den Skripts zu beheben. Unter Windows wird die zusätzliche CreateProcess
für die Weiterleitung benötigt
vom Skript an den tatsächlichen Compiler
möglicherweise eine auffällige
sich negativ auf die Build-Geschwindigkeit auswirken.
$ $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 sie zuzuordnen.
das heruntergeladene NDK entsprechend der folgenden Tabelle:
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 Zieldreifach mit einem
-Suffix für minSdkVersion
. Dieses Suffix wird nur mit
clang/clang++; Die binutils-Tools (wie ar
und strip
) benötigen keinen
, da sie von minSdkVersion
nicht betroffen sind. Unterstützte Android-Geräte
sind folgende Zieldreifachen:
ABI | Triple |
---|---|
Armeabi-V7a | armv7a-linux-androideabi |
arm64-v8a | aarch64-linux-android |
x86 | i686-linux-android |
x86–64 | x86_64-linux-android |
Viele Projekte Build-Skripts erwarten Cross-Compiler im GCC-Stil, in denen alle
Der Compiler zielt nur auf eine Kombination aus Betriebssystem und Architektur ab und verarbeitet diese daher möglicherweise nicht
-target
sauber. In diesen Fällen können Sie normalerweise die -target
Argument als Teil der Compilerdefinition (z.B. CC="clang -target
aarch64-linux-android21
). In seltenen Fällen kann das von Ihnen verwendete Build-System
in diesem Format nicht verwenden können, sollten Sie die Clang-Binärdateien mit drei Präfixen verwenden.
Automatische Konfiguration
Mit Autoconf-Projekten können Sie die Toolchain angeben, die mit der Umgebung verwendet werden soll
Variablen. Das folgende Beispiel zeigt, wie libpng
für Android erstellt wird
x86-64 mit einer minSdkVersion
von API-Level 21 unter 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
Die in diesem Beispiel ausgewählten Tools sind für NDK r22 und höher geeignet. Ältere NDKs andere Tools erfordern.
Erstellen von Projekten ohne Autoconf
Einige Makefile-Projekte ermöglichen eine Cross-Kompilierung durch Überschreiben derselben Variablen
wie bei einem Autoconf-Projekt. Hier ein Beispiel dafür, wie
um libbzip2
für Android x86-64 mit einer minSdkVersion
von 21 zu erstellen.
# 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
Die in diesem Beispiel ausgewählten Tools sind für NDK r22 und höher geeignet. Ältere NDKs andere Tools erfordern.