Inhaltsverzeichnis
- Einführung
- Vorbereiten der Build-Umgebung
- Build-Ausführung über Befehlszeile
- Build über Eclipse*-IDE
- Hinweis zur Vermeidung der Bereinigung von Binaries unter
.\libs\[targetabi]
- Weitere Artikel und Ressourcen zu diesem Thema
Einführung
Android*-Geräte können mit Prozessoren ausgestattet sein, die die ARM-* oder die x86-Befehlssatzarchitektur (Instruction Set Architecture, ISA) unterstützen. Unterschiedliche ISAs sind nicht binärkompatibel. Aus diesem Grund sollte eine Anwendung, die nativen Code enthält, für jede Ziel-ISA native Bibliotheken bereitstellen. Die „Fat“-Android*-Anwendungspakete („Fat“-APK) sind einer der möglichen Verteilungsmechanismen für solche Anwendungen.
Dieser Artikel enthält eine schrittweise Anleitung zur Erstellung einer „Fat“-APK, die die ISA-unabhängigen Dex-Dateien für die Dalvik* Virtual Machine (Dalvik, 2013) sowie die Bibliotheken für verschiedene Ziel-ISAs enthält. Dazu gehört auch das Erstellen der nativen Anwendungsbibliothek für x86 mit dem Intel® C++-Compiler für Android*.
Zur Veranschaulichung verwenden wir das Beispiel hello-gl2 aus der NDK-r9-Distribution.
Vorbereiten der Build-Umgebung
Die folgenden Tools werden benötigt und sollten entsprechend der Empfehlung installiert werden:
- Android* SDK Bundle (2013) – installiert unter
[android-sdk-dir]
- Android* Native Development Kit (Android NDK 2013) – installiert unter
[ndk-dir]
- Java* Development Kit 6 – installiert unter
[jdk6-dir]
- Apache* Ant* Tool Version 1.8 – installiert unter
[ant-dir]
- Intel® C++-Compiler für Android* – installiert unter
[icc-dir]
Der Compiler sollte zuletzt installiert werden.
Hinzufügen der erforderlichen Verzeichnisse zur Umgebungsvariablen „PATH“:
- Verzeichnis „
[ndk-dir]
“ zur Verwendung des Tools „ndk-build
“ - Verzeichnis „
[android-sdk-dir]\sdk\tools
“ zur Verwendung des Tools „android
“ - Verzeichnis „
[ant-dir]\bin
“ zur Verwendung des Tools „ant
“ - Verzeichnis „
[jdk6-dir]\jre\bin
“ zur Verwendung der „java
"-VM. Wird vom Tool „ant
“ benötigt.
Achten Sie darauf, dass Sie in einer Windows*-Umgebung für „program files (x86)
“ kurze Ordnernamen verwenden, z. B. „PROGRA~2
“ - Erstellen der neuen Umgebungsvariablen „
JAVA_HOME=[jdk6-dir]
“
Build-Ausführung über Befehlszeile
Dieser Abschnitt beschreibt, wie Sie das APK-Paket zur Unterstützung von Android-Geräten mit ARM*- und x86-Architekturen über eine befehlszeilenbasierte Build-Umgebung erstellen.
Öffnen Sie zunächst ein Befehlsfenster oder ein Terminalfenster unter Linux*. Navigieren Sie dann zum Android-NDK-Beispielverzeichnis „hello-gl2
“ ([ndk-dir]\samples\hello-gl2
) und führen Sie die Schritte unten aus.
Hinweis: Über dieses Fenster sollten Sie Zugang zu allen oben genannten Tools haben.
Konfigurieren der Anwendung
Führen Sie aus dem Verzeichnis „hello-gl2
“ den folgenden Befehl aus, um die Dateibuild.xml
, die später für den Beispiel-Build verwendet wird, zu erstellen.$ android update project --target android-18 --name HelloGL2 --path . --subprojects
--target android-18
: entspricht dem Android-Release Jelly Beans MR2.Bereinigen des Arbeitsbereichs der Anwendung
Verwenden Sie den folgenden Befehl, um den gesamten Arbeitsbereich, einschließlich der Bibliotheken für alle ISA-Architekturen, zu bereinigen.
$ ant clean
$ ndk-build V=1 APP_ABI=all clean
. V=1
: gibt alle Befehle, während sie ausgeführt werden, aus.
. APP_ABI=all
: erzwingt die Bereinigung der Zwischendateien für alle Ziele. Wenn dieser Parameter nicht angegeben wird, wird nur das Zielarmeabi
bereinigt.Erstellen der Binary für die ARM*-Architektur
Verwenden Sie den folgenden Befehl, um die Anwendungs-Binary für die ARM-Architektur zu erstellen:
$ ndk-build APP_ABI=armeabi V=1 NDK_TOOLCHAIN=arm-linux-androideabi-4.8
. APP_ABI=armeabi
: konfiguriert die Kompilierung für das ARM*-Ziel.
. NDK_TOOLCHAIN=arm-linux-androideabi-4.8
: überschreibt die standardmäßige GNU* GCC 4.6 und verwendet stattdessen GCC 4.8.Die Anwendungs-Binary (
libgl2jni.so
) wird unter.\libs\armeabi\libgl2jni.so
erstellt.Erstellen der Binary für die x86-Architektur mit dem Intel Compiler
Verwenden Sie den folgenden Befehl, um die Anwendungs-Binary für die x86-Architektur mit dem Intel Compiler zu erstellen:
$ ndk-build APP_ABI=x86 V=1 NDK_TOOLCHAIN=x86-icc NDK_APP.local.cleaned_binaries=true
. APP_ABI=x86
: konfiguriert die Kompilierung für die x86-Architektur.
. NDK_TOOLCHAIN=x86-icc
: überschreibt die standardmäßige GCC 4.6 mit dem Intel C/C++-Compiler für Android.
. NDK_APP.local.cleaned_binaries=true
: unterdrückt das Entfernen der Bibliothek aus dem Verzeichnis libs/armeabi. Siehe Hinweise ganz unten.Die Anwendungs-Binary (
libgl2jni.so
) wird unter.\libs\x86\libgl2jni.so
erstellt.Vorbereiten des Anwendungspakets (APK)
Wenn alle Binaries für das Android-Ziel erstellt sind, prüfen Sie, ob das Verzeichnis
libs\[targetabi]
die erforderliche Bibliothek für jede Zielarchitektur enthält.Um die Paketerstellung zu vereinfachen und die Paketsignierung zu umgehen, erstellen Sie mit dem folgenden Befehl ein Debug-Paket:
$ ant debug
Das neu erstellte Paket
HelloGL2-debug.zip
befindet sich im Verzeichnis.\bin
. Es kann auf x86*- oder ARM*-Emulatoren ausgeführt werden, die mindestens Level 18 der vom Android SDK bereitgestellten API unterstützen.
Das PaketHelloGL2-debug.zip
enthält Bibliotheken für zwei Ziele: ARM EABI und x86.
Build über Eclipse*-IDE
- Öffnen Sie Eclipse und laden Sie das Beispiel
[ndk-dir]/samples/hello-gl2
.- Wählen Sie im Menü
File > New > Project > Android Project...
- Wählen Sie die Schaltfläche
Android project from existing code
. - Wählen Sie einen beliebigen API-Level über Android 1.5.
- Klicken Sie im Feld
Root Directory
aufBrowse...
und wählen Sie das Verzeichnis[ndk-dir]/samples/hello-gl2
. - Klicken Sie auf
Finish
.
- Wählen Sie im Menü
- Fügen Sie
nativen Support
zum Projekt hinzu:
Klicken Sie mit der rechten Maustaste auf den Projektnamen und wählen SieAndroid Tools > Add Native Support...
- Erstellen Sie eine separate Build-Konfiguration für jede Zielplattform und setzen Sie den Build-Befehl.
Klicken Sie mit der rechten Maustaste auf das Projekt und wählen SieProject properties -> C/C++ Builder -> "Manage configurations..."
Klicken Sie aufNew
, um die folgenden neuen Konfigurationen auf Basis der KonfigurationDefault
hinzuzufügen:„x86_icc“ für x86-Ziel mit Intel Compiler ICC
„amr_gcc“ für ARM-Ziel mit GNU GCC
Configuration
auf „x86_icc“:- Deaktivieren Sie „Use default build command“.
- Fügen Sie Folgendes zum Feld
Build command
hinzu:ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc
Configuration
auf „arm_gcc“:- Deaktivieren Sie „Use default build command“.
- Fügen Sie Folgendes zum Feld
Build command
hinzu:ndk-build APP_ABI=armeabi NDK_TOOLCHAIN=arm-linux-androideabi-4.8
- Klicken Sie auf
OK
.
- Bereinigen Sie den gesamten Arbeitsbereich der Anwendung.
Klicken Sie hierzu mit der rechten Maustaste auf das Projekt und wählen SieBuild configurations > Clean all…
Hinweis: Ist
Application.mk
im Verzeichnisjni
vorhanden, stellen Sie sicher, dass die folgende Zeile NICHT vorhanden ist:NDK_APP.local.cleaned_binaries=true
- Erstellen Sie die App-Binary für das ARM*-Ziel mit der GCC.
- Erstellen Sie
Application.mk
im Verzeichnisjni
und fügen Sie die folgende Zeile hinzu:NDK_APP.local.cleaned_binaries=true
- Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie
Build configurations > Set Active > arm_gcc
. - Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie
Build Project
. - Prüfen Sie die erstellte Binärdatei unter
[eclipse-workspace-dir]\GL2JNIActivity\libs\armeabi\libgl2jni.so
.
- Erstellen Sie
- Erstellen Sie die App-Binary für x86 mit dem Intel Compiler.
- Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie
Build configurations > Set Active > x86_icc
. - Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie
Build Project
. - Prüfen Sie die erstellte Binärdatei unter
[eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so
.
- Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie
- Erstellen Sie alle App-Binaries für alle konfigurierten Ziele.
- Erstellen Sie
Application.mk
im Verzeichnisjni
und fügen Sie die folgende Zeile hinzu:NDK_APP.local.cleaned_binaries=true
- Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie
Build configurations > Build All...
- Prüfen Sie die erstellten Binärdateien unter:
[eclipse-workspace-dir]\GL2JNIActivity\libs\armeabi\libgl2jni.so
[eclipse-workspace-dir]\GL2JNIActivity\libs\x86\libgl2jni.so
- Erstellen Sie
- Erstellen Sie nicht signierte Anwendungspakete.
Klicken Sie hierzu mit der rechten Maustaste auf das Projekt und wählen SieAndroid Tools > Add Native Support...
Hinweis zur Vermeidung der Bereinigung von Binaries unter .\libs\[targetabi]
Der Parameter NDK_APP.local.cleaned_binaries=true
, mit dem sich die Entfernung zuvor erstellter Bibliotheken unterdrücken lässt, funktioniert in zukünftigen NDK-Releases eventuell nicht mehr. Informationen zur Deaktivierung von Löschvorgängen für die neu installierten Ziel-Binaries finden Sie im Makefile [ndk-dir]/build/core/setup-app.mk
.
Weitere Artikel und Ressourcen zu diesem Thema
- Methoden für das Portieren von Android*-NDK-Anwendungen
- Ändern des Standard-Compilers für x86-Ziele vom Intel C++-Compiler zur GCC
- Intel® C++-Compiler für Mac OS* – Kompatibilität mit den GNU*-Compilern GCC und G++
- Android*-NDK für die Intel® Architektur
- Beschleunigung des Android*-Emulators auf der Intel® Architektur
Weitere Informationen über Intel® Tools für Android-Entwickler siehe Intel® Developer Zone für Android.