Użyj gotowych bibliotek

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:

  1. Nazwij moduł. Ta nazwa nie musi być taka sama jak nazwy wstępnie utworzonej z biblioteki.
  2. 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 zmiennej LOCAL_PATH.

  3. Uwzględnij PREBUILT_SHARED_LIBRARY lub PREBUILT_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.