Zestaw NDK obsługuje gotowe biblioteki, zarówno statyczne, jak i współdzielone. Ta funkcja ma 2 główne przypadki użycia:
- Dystrybuowanie własnych bibliotek do zewnętrznych programistów pakietów NDK bez dystrybucji źródeł.
- Używanie gotowej wersji własnych bibliotek, aby przyspieszyć kompilację.
Na tej stronie dowiesz się, jak korzystać z gotowych bibliotek.
Deklarowanie gotowej biblioteki
Każdą gotową bibliotekę, której używasz, musisz zadeklarować jako moduł niezależny. Aby to zrobić, wykonaj te czynności:
- Nazwij moduł. Ta nazwa nie musi być taka sama jak nazwa gotowej biblioteki.
W pliku Android.mk modułu przypisz
LOCAL_SRC_FILES
ścieżkę do gotowej biblioteki, którą udostępniasz. Podaj ścieżkę względną do wartości zmiennejLOCAL_PATH
.Dołącz
PREBUILT_SHARED_LIBRARY
lubPREBUILT_STATIC_LIBRARY
w zależności od tego, czy używasz biblioteki udostępnionej (.so
) czy statycznej (.a
).
Oto prosty przykład, który zakłada, że gotowa biblioteka libfoo.so
znajduje się w tym samym katalogu co plik Android.mk, który ją opisuje.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
W tym przykładzie nazwa modułu jest taka sama jak nazwa gotowej biblioteki.
System kompilacji umieszcza kopię gotowej biblioteki udostępnionej w pliku $PROJECT/obj/local
, a drugą kopię bez informacji debugowania umieszcza w pliku $PROJECT/libs/<abi>
. $PROJECT
to katalog główny Twojego projektu.
odwoływać się do gotowej biblioteki z innych modułów.
Aby odwoływać się do gotowej biblioteki z innych modułów, podaj jej nazwę jako wartość zmiennej LOCAL_STATIC_LIBRARIES
lub LOCAL_SHARED_LIBRARIES
w plikach Android.mk powiązanych z tymi modułami.
Na przykład opis modułu korzystającego z elementu libfoo.so
może wyglądać tak:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE
to nazwa modułu, który odnosi się do gotowego modułu, a LOCAL_SHARED_LIBRARIES
to nazwa gotowego modułu.
Eksportuj nagłówki do gotowych bibliotek
Kod w pliku foo-user.c
zależy od konkretnych deklaracji, które zwykle znajdują się w pliku nagłówka (np. foo.h
), rozpowszechnianym za pomocą gotowej biblioteki. Na przykład foo-user.c
może mieć wiersz podobny do tego:
#include <foo.h>
W takim przypadku podczas tworzenia modułu foo-user
musisz podać nagłówek i ścieżkę uwzględniania do kompilatora. Prostym sposobem na wykonanie tego zadania jest użycie eksportów w definicji gotowego modułu. Jeśli na przykład nagłówek foo.h
znajduje się w katalogu include
powiązanym z gotowym modułem, możesz go zadeklarować w ten sposób:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Podana tutaj definicja LOCAL_EXPORT_C_INCLUDES
zapewnia, że system kompilacji eksportuje ścieżkę do katalogu include
gotowej biblioteki, dodając tę ścieżkę do wartości LOCAL_C_INCLUDES
zależnego od niej modułu.
Ta operacja umożliwia systemowi kompilacji znalezienie niezbędnych nagłówków.
Debuguj gotowe biblioteki
Zalecamy udostępnienie gotowych bibliotek udostępnionych zawierających symbole na potrzeby debugowania. System kompilacji NDK zawsze usuwa symbole z wersji biblioteki, którą instaluje do $PROJECT/libs/<abi>/
, ale możesz użyć wersji debugowania do debugowania za pomocą ndk-gdb
.
Wybierz interfejsy ABI dla gotowych bibliotek
Musisz wybrać odpowiednią wersję gotowej biblioteki współdzielonej dla docelowego interfejsu ABI. Zmienna TARGET_ARCH_ABI
w pliku Android.mk może wskazywać system kompilacji na odpowiednią wersję biblioteki.
Załóżmy na przykład, że Twój projekt zawiera 2 wersje biblioteki libfoo.so
:
armeabi/libfoo.so
x86/libfoo.so
Ten fragment kodu pokazuje, jak używać biblioteki TARGET_ARCH_ABI
, aby system kompilacji wybierał odpowiednią wersję biblioteki:
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)
Jeśli jako wartość zmiennej TARGET_ARCH_ABI
podasz armeabi
, system kompilacji użyje wersji libfoo.so
znajdującej się w katalogu armeabi
. Jeśli jako wartość TARGET_ARCH_ABI
podasz x86
, system kompilacji użyje wersji z katalogu x86
.