Vordefinierte Bibliotheken verwenden

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:

  1. Geben Sie dem Modul einen Namen. Dieser Name muss nicht mit dem der vordefinierten Bibliothek selbst übereinstimmen.
  2. 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 Variablen LOCAL_PATH an.

  3. Fügen Sie PREBUILT_SHARED_LIBRARY oder PREBUILT_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.