Vordefinierte Bibliotheken verwenden

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:

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

  3. Geben Sie PREBUILT_SHARED_LIBRARY oder PREBUILT_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.