Das NDK unterstützt die Verwendung vordefinierter Bibliotheken, sowohl statische als auch gemeinsam genutzte Bibliotheken. Es sind zwei Hauptanwendungsfälle für diese Funktion:
- Die Verteilung eigener Bibliotheken an NDK-Drittentwickler ohne Ihre Quellen zu verbreiten.
- Build mit einer vordefinierten Version Ihrer eigenen Bibliotheken beschleunigen.
Auf dieser Seite wird die Verwendung vordefinierter Bibliotheken erläutert.
Vordefinierte Bibliothek deklarieren
Sie müssen jede vordefinierte Bibliothek, die Sie verwenden, als unabhängiges Modul deklarieren. Aufgabe Gehen Sie daher so vor:
- Geben Sie dem Modul einen Namen. Dieser Name muss nicht mit dem der vordefinierten an sich.
Weisen Sie in der Datei Android.mk des Moduls
LOCAL_SRC_FILES
den Pfad zu der von Ihnen bereitgestellten vordefinierten Bibliothek. Geben Sie den Pfad relativ zum Wert IhrerLOCAL_PATH
-Variablen.Geben Sie
PREBUILT_SHARED_LIBRARY
oderPREBUILT_STATIC_LIBRARY
an, je nachdem, unabhängig davon, ob Sie eine gemeinsam genutzte (.so
) oder eine statische (.a
) Bibliothek verwenden.
Hier ist ein einfaches Beispiel, bei dem davon ausgegangen wird, dass sich die vordefinierte Bibliothek libfoo.so
im selben Verzeichnis wie die Datei Android.mk, in der sie beschrieben wird.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
In diesem Beispiel ist der Name des Moduls mit dem des vordefinierten Bibliothek.
Das Build-System platziert eine Kopie Ihrer vordefinierten gemeinsam genutzten Bibliothek in
$PROJECT/obj/local
und eine weitere Kopie ohne Debug-Informationen in
$PROJECT/libs/<abi>
. Hier ist $PROJECT
das Stammverzeichnis Ihres Projekts.
In anderen Modulen auf die vordefinierte Bibliothek verweisen
Um von anderen Modulen auf eine vordefinierte Bibliothek zu verweisen, geben Sie ihren Namen als das
Wert der Variablen LOCAL_STATIC_LIBRARIES
oder LOCAL_SHARED_LIBRARIES
in
die Android.mk-Dateien, die mit diesen Modulen verknüpft sind.
Die Beschreibung eines Moduls mit libfoo.so
könnte beispielsweise so aussehen:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
Hier ist LOCAL_MODULE
der Name des Moduls, das auf das vordefinierte Modul verweist.
LOCAL_SHARED_LIBRARIES
ist der Name der vordefinierten Datei.
Header für vordefinierte Bibliotheken exportieren
Der Code in foo-user.c
hängt von bestimmten Deklarationen ab, die normalerweise
in einer Headerdatei wie foo.h
, die mit der vordefinierten Bibliothek bereitgestellt wird. Für
foo-user.c
könnte beispielsweise eine Zeile wie die folgende enthalten:
#include <foo.h>
In diesem Fall müssen Sie den Header und den zugehörigen Pfad zum
-Compiler, wenn Sie das Modul foo-user
erstellen. Das geht ganz einfach
besteht die Aufgabe darin, Exporte in der
vordefinierten Moduldefinition zu verwenden. Beispiel: Wenn lange
als Header foo.h
befindet sich im Verzeichnis include
, das mit dem
vordefiniertes Modul können Sie es so deklarieren:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Die LOCAL_EXPORT_C_INCLUDES
-Definition hier sorgt dafür, dass das Build-System
exportiert den Pfad zum Verzeichnis include
der vordefinierten Bibliothek,
Pfad zum Wert des LOCAL_C_INCLUDES
für das davon abhängige Modul.
Durch diesen Vorgang kann das Build-System die erforderlichen Header finden.
Fehler in vordefinierten Bibliotheken beheben
Wir empfehlen, vordefinierte gemeinsam genutzte Bibliotheken mit Debugging-Funktionen zur Verfügung zu stellen
. Das NDK-Build-System entfernt die Symbole immer aus der Version des
die in $PROJECT/libs/<abi>/
installiert wird. Sie können aber auch
Version für das Debugging mit ndk-gdb
.
ABIs für vordefinierte Bibliotheken auswählen
Sie müssen die richtige Version Ihrer vordefinierten gemeinsam genutzten Bibliothek auswählen
für Ihr Ziel-ABI. Die TARGET_ARCH_ABI
in der Datei Android.mk kann das Build-System auf den entsprechenden
Version der Bibliothek.
Angenommen, Ihr Projekt enthält zwei Versionen der Bibliothek
libfoo.so
:
armeabi/libfoo.so
x86/libfoo.so
Das folgende Snippet zeigt, wie TARGET_ARCH_ABI
verwendet wird, damit der Build
wählt das System die entsprechende Version der Bibliothek aus:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Wenn Sie armeabi
als Wert für TARGET_ARCH_ABI
angegeben haben, erstellt der Build
System verwendet die Version von libfoo.so
, die sich im Verzeichnis armeabi
befindet. Wenn
x86
als Wert TARGET_ARCH_ABI
angegeben haben, verwendet das Build-System
die Version im Verzeichnis x86
.