Użyj gotowych bibliotek

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:

  1. Nazwij moduł. Ta nazwa nie musi być taka sama jak nazwa gotowej biblioteki.
  2. 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 zmiennej LOCAL_PATH.

  3. Dołącz PREBUILT_SHARED_LIBRARY lub PREBUILT_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.