Используйте готовые библиотеки

NDK поддерживает использование готовых библиотек, как статических, так и общих. Существует два основных варианта использования этой функции:

  • Распространение собственных библиотек сторонним разработчикам NDK без распространения исходников.
  • Использование предварительно созданной версии ваших собственных библиотек для ускорения сборки.

На этой странице объясняется, как использовать готовые библиотеки.

Объявить готовую библиотеку

Вы должны объявить каждую используемую предварительно созданную библиотеку как независимый модуль. Для этого выполните следующие шаги:

  1. Дайте модулю имя. Это имя не обязательно должно совпадать с именем самой предварительно созданной библиотеки.
  2. В файле Android.mk модуля назначьте LOCAL_SRC_FILES путь к предоставленной вами предварительно созданной библиотеке. Укажите путь относительно значения вашей переменной LOCAL_PATH .

  3. Включите PREBUILT_SHARED_LIBRARY или PREBUILT_STATIC_LIBRARY в зависимости от того, используете ли вы общую ( .so ) или статическую ( .a ) библиотеку.

Вот тривиальный пример, в котором предполагается, что предварительно созданная библиотека libfoo.so находится в том же каталоге, что и описывающий ее файл Android.mk .

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)

В этом примере имя модуля такое же, как и у предварительно собранной библиотеки.

Система сборки помещает копию вашей предварительно созданной общей библиотеки в $PROJECT/obj/local , а другую копию, лишенную отладочной информации, в $PROJECT/libs/<abi> . Здесь $PROJECT — это корневой каталог вашего проекта.

Ссылайтесь на готовую библиотеку из других модулей.

Чтобы ссылаться на предварительно созданную библиотеку из других модулей, укажите ее имя как значение переменной LOCAL_STATIC_LIBRARIES или LOCAL_SHARED_LIBRARIES в файлах Android.mk , связанных с этими другими модулями.

Например, описание модуля, использующего libfoo.so может быть следующим:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)

Здесь LOCAL_MODULE — это имя модуля, относящегося к предварительно собранному; LOCAL_SHARED_LIBRARIES — это имя предварительно созданной библиотеки.

Экспорт заголовков для готовых библиотек

Код в foo-user.c зависит от конкретных объявлений, которые обычно находятся в заголовочном файле, например foo.h , распространяемом вместе со встроенной библиотекой. Например, foo-user.c может содержать следующую строку:

#include <foo.h>

В таком случае вам необходимо предоставить заголовок и путь к нему компилятору при сборке модуля foo-user . Простой способ выполнить эту задачу — использовать экспорт в предварительно созданном определении модуля. Например, пока заголовок foo.h находится в каталоге include , связанном с готовым модулем, вы можете объявить его следующим образом:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

Определение LOCAL_EXPORT_C_INCLUDES здесь гарантирует, что система сборки экспортирует путь к каталогу include предварительно созданной библиотеки, добавляя этот путь к значению LOCAL_C_INCLUDES для зависимого от него модуля.

Эта операция позволяет системе сборки найти необходимые заголовки.

Отладка готовых библиотек

Мы рекомендуем вам предоставить готовые общие библиотеки, содержащие символы отладки. Система сборки NDK всегда удаляет символы из версии библиотеки, которую она устанавливает, в $PROJECT/libs/<abi>/ , но вы можете использовать отладочную версию для отладки с помощью ndk-gdb .

Выберите ABI для готовых библиотек.

Вы должны убедиться, что выбрали правильную версию предварительно созданной общей библиотеки для целевого ABI. Переменная TARGET_ARCH_ABI в файле Android.mk может указывать системе сборки соответствующую версию библиотеки.

Например, предположим, что ваш проект содержит две версии библиотеки libfoo.so :

armeabi/libfoo.so
x86/libfoo.so

В следующем фрагменте показано, как использовать TARGET_ARCH_ABI , чтобы система сборки выбирала подходящую версию библиотеки:

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)

Если вы указали armeabi в качестве значения TARGET_ARCH_ABI , система сборки использует версию libfoo.so , расположенную в каталоге armeabi . Если вы указали x86 в качестве значения TARGET_ARCH_ABI , система сборки использует версию из каталога x86 .