NDK mit anderen Build-Systemen verwenden

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.