Pakiet NDK umożliwia korzystanie z gotowych bibliotek, zarówno statycznych, jak i współdzielonych. OK są 2 główne przypadki użycia tej funkcji:
- Dystrybucja własnych bibliotek zewnętrznym programistom NDK bez dystrybucji źródeł.
- Użycie gotowej wersji własnych bibliotek w celu przyspieszenia kompilacji.
Na tej stronie dowiesz się, jak używać gotowych bibliotek.
Deklarowanie gotowej biblioteki
Każdą gotową bibliotekę, której używasz, musisz zadeklarować jako niezależny moduł. Do zrobienia więc wykonaj te czynności:
- Nazwij moduł. Ta nazwa nie musi być taka sama jak nazwy wstępnie utworzonej z biblioteki.
W pliku Android.mk modułu przypisz użytkownikowi
LOCAL_SRC_FILES
ścieżkę do z udostępnianej przez Ciebie gotowej biblioteki. Podaj ścieżkę względem parametru wartości zmiennejLOCAL_PATH
.Uwzględnij
PREBUILT_SHARED_LIBRARY
lubPREBUILT_STATIC_LIBRARY
, w zależności od niezależnie od tego, czy używasz biblioteki udostępnionej (.so
), czy statycznej (.a
).
Oto trywialny przykład, w którym zakładamy, że znajduje się w nim gotowa biblioteka libfoo.so
w tym samym katalogu co plik Android.mk, który go 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 gotowego modułu. bibliotece.
System kompilacji umieszcza kopię gotowej biblioteki współdzielonej w
$PROJECT/obj/local
oraz jeszcze jedna kopia, bez danych debugowania, do
$PROJECT/libs/<abi>
W tym miejscu $PROJECT
jest katalogiem głównym Twojego projektu.
Korzystaj z gotowej biblioteki z innych modułów
Aby odwołać się do gotowej biblioteki z innych modułów, nadaj jej nazwę
wartości zmiennej LOCAL_STATIC_LIBRARIES
lub LOCAL_SHARED_LIBRARIES
w
pliki Android.mk powiązane z tymi modułami.
Na przykład opis modułu z użyciem atrybutu 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)
W tym przykładzie LOCAL_MODULE
to nazwa modułu odwołującego się do gotowego modułu.
LOCAL_SHARED_LIBRARIES
to nazwa samego gotowego elementu.
Eksportuj nagłówki gotowych bibliotek
Kod w elemencie foo-user.c
zależy od konkretnych deklaracji, które zwykle znajdują się w niej
w pliku nagłówka, np. foo.h
, rozpowszechnianym za pomocą gotowej biblioteki. Dla:
Na przykład foo-user.c
może mieć wiersz podobny do tego:
#include <foo.h>
W takim przypadku podaj nagłówek i jego ścieżkę uwzględniającą do funkcji
kompilatora podczas tworzenia modułu foo-user
. Aby to zrobić, należy:
Zadanie to użycie eksportów z definicji gotowego modułu. Na przykład, jeśli
ponieważ nagłówek foo.h
znajduje się w katalogu include
powiązanym z
gotowym module, 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)
Stosowana tutaj definicja LOCAL_EXPORT_C_INCLUDES
gwarantuje, że system kompilacji
eksportuje ścieżkę do katalogu include
gotowej biblioteki, z zastosowaniem prefiksu
na wartość zmiennej LOCAL_C_INCLUDES
modułu od niego zależnego.
Ta operacja umożliwia systemowi kompilacji znalezienie niezbędnych nagłówków.
Debuguj gotowe biblioteki
Zalecamy udostępnienie gotowych bibliotek udostępnionych zawierających funkcje debugowania
symboli. System kompilacji NDK zawsze usuwa symbole z wersji
którą instaluje w $PROJECT/libs/<abi>/
, ale można skorzystać z debugowania
do debugowania za pomocą narzędzia ndk-gdb
.
Wybierz interfejsy ABI dla gotowych bibliotek
Pamiętaj, aby wybrać odpowiednią wersję gotowej biblioteki współdzielonej
do docelowego interfejsu ABI. TARGET_ARCH_ABI
w pliku Android.mk może wskazać systemowi kompilacji odpowiednie polecenie
wersji 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żyć pliku TARGET_ARCH_ABI
, aby kompilacja
system 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 podano armeabi
jako wartość TARGET_ARCH_ABI
, kompilacja
system używa wersji libfoo.so
znajdującej się w katalogu armeabi
. Jeśli
określono x86
jako wartość TARGET_ARCH_ABI
, system kompilacji używa
wersję z katalogu x86
.