Der NDK unterstützt sowohl statische als auch gemeinsam genutzte vordefinierte Bibliotheken. Für diese Funktion gibt es zwei grundlegende Anwendungsfälle:
- Sie können Ihre eigenen Bibliotheken an externe NDK-Entwickler verteilen, ohne Ihre Quellen zu verteilen.
- Vorgefertigte Version eigener Bibliotheken verwenden, um den Build zu beschleunigen
Auf dieser Seite wird erläutert, wie vordefinierte Bibliotheken verwendet werden.
Vorkonfigurierte Bibliothek deklarieren
Sie müssen jede vordefinierte Bibliothek, die Sie verwenden, als unabhängiges Modul deklarieren. Führen Sie dazu die folgenden Schritte aus:
- Geben Sie dem Modul einen Namen. Dieser Name muss nicht mit dem der vordefinierten Bibliothek selbst übereinstimmen.
Weisen Sie
LOCAL_SRC_FILES
in der Datei Android.mk des Moduls den Pfad zur vordefinierten Bibliothek zu, die Sie bereitstellen. Geben Sie den Pfad relativ zum Wert der VariablenLOCAL_PATH
an.Fügen Sie
PREBUILT_SHARED_LIBRARY
oderPREBUILT_STATIC_LIBRARY
ein, je nachdem, ob Sie eine freigegebene (.so
) oder eine statische (.a
) Bibliothek verwenden.
In diesem einfachen Beispiel wird davon ausgegangen, dass sich die vordefinierte Bibliothek libfoo.so
im selben Verzeichnis wie die Datei Android.mk befindet, die sie beschreibt.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
In diesem Beispiel entspricht der Name des Moduls dem Namen der vordefinierten Bibliothek.
Das Build-System speichert 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.
Auf die vordefinierte Bibliothek aus anderen Modulen zugreifen
Wenn Sie aus anderen Modulen auf eine vordefinierte Bibliothek verweisen möchten, geben Sie deren Namen als Wert der Variablen LOCAL_STATIC_LIBRARIES
oder LOCAL_SHARED_LIBRARIES
in den Android.mk-Dateien an, 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 sich auf das vordefinierte Modul bezieht. LOCAL_SHARED_LIBRARIES
ist der Name des vordefinierten Moduls selbst.
Header für vordefinierte Bibliotheken exportieren
Der Code in foo-user.c
hängt von bestimmten Deklarationen ab, die sich normalerweise in einer Headerdatei wie foo.h
befinden, die mit der vordefinierten Bibliothek vertrieben wird. foo-user.c
könnte beispielsweise eine Zeile wie diese haben:
#include <foo.h>
In einem solchen Fall müssen Sie beim Erstellen des foo-user
-Moduls den Header und seinen Include-Pfad für den Compiler angeben. Eine einfache Möglichkeit, dies zu tun, besteht darin, Exporte in der vordefinierten Moduldefinition zu verwenden. Wenn sich der Header foo.h
beispielsweise im Verzeichnis include
befindet, das dem vordefinierten Modul zugeordnet ist, können Sie ihn 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 sorgt hier dafür, dass das Build-System den Pfad in das include
-Verzeichnis der vordefinierten Bibliothek exportiert und diesem den Wert von LOCAL_C_INCLUDES
für das davon abhängige Modul voranstellt.
Durch diesen Vorgang kann das Build-System die erforderlichen Header finden.
Fehler in vordefinierten Bibliotheken beheben
Wir empfehlen, vordefinierte freigegebene Bibliotheken mit Debug-Symbolen bereitzustellen. Das NDK-Build-System entfernt die Symbole immer aus der Version der Bibliothek, die es in $PROJECT/libs/<abi>/
installiert. Sie können jedoch die Debug-Version für die Fehlerbehebung mit ndk-gdb
verwenden.
ABIs für vordefinierte Bibliotheken auswählen
Sie müssen die richtige Version Ihrer vordefinierten gemeinsam genutzten Bibliothek für Ihr Ziel-ABIs auswählen. Mit der Variablen TARGET_ARCH_ABI
in der Datei Android.mk kann das Build-System auf die entsprechende Version der Bibliothek verweisen.
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 das Build-System die geeignete Version der Bibliothek auswählt:
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 von TARGET_ARCH_ABI
angegeben haben, verwendet das Build-System die Version von libfoo.so
, die sich im Verzeichnis armeabi
befindet. Wenn Sie x86
als Wert TARGET_ARCH_ABI
angegeben haben, verwendet das Build-System die Version im Verzeichnis x86
.