Как мне включить общий модуль в 2 разных приложения (Android)

#android #makefile #multiple-makefiles

#Android #makefile #несколько-makefiles

Вопрос:

Мне нужна небольшая помощь с make-файлами Android.

Для 2 моих приложений есть один общий модуль. Я планировал создать makefile для общего модуля common.mk и включить его в оба моих приложения.

Вот так:

 app1:
=====
main.c
Android.mk
  ...
  ...
  include ../common/common.mk
  LOCAL_MODULE := app1
  ...
  ...

app2:
=====
main.c
Android.mk
  ...
  ...
  include ../common/common.mk
  LOCAL_MODULE := app2
  ...
  ...

common:
=======
common.mk
common.c
  

когда я создаю из корневого каталога с помощью make app2 , я получаю множественные ошибки определения для всех функций, которые не входят в общий модуль.

Я пришел к выводу, что common.mk включается дважды, пока система сборки Android ищет правильную цель (app2 в моем случае). Именно поэтому возникает проблема.

Теперь, как мне это контролировать? Каков стандартный способ в Android?

Ответ №1:

Правильным способом должно быть создание общей библиотеки (общей или статической) с использованием целей BUILD_SHARED_LIBRARY или BUILD_STATIC_LIBRARY .

А затем добавить их в app1 и app2 просто использовать LOCAL_STATIC_LIBRARIES или LOCAL_SHARED_LIBRARIES для создания зависимости между app1 , app2 и common .

Проверьте Android.mk спецификация синтаксиса файла для получения дополнительной информации:

BUILD_SHARED_LIBRARY

Указывает на сценарий сборки, который собирает всю информацию о модуле, предоставленную вами в переменных LOCAL_XXX, и определяет, как создать целевую общую библиотеку из перечисленных вами источников. Обратите внимание, что у вас должны быть определены LOCAL_MODULE и LOCAL_SRC_FILES, как минимум, перед включением этого файла.

Пример использования:

   include $(BUILD_SHARED_LIBRARY)
  

Обратите внимание, что при этом будет сгенерирован файл с именем lib$(LOCAL_MODULE).so

BUILD_STATIC_LIBRARY

Вариант BUILD_SHARED_LIBRARY, который используется для создания целевой статической библиотеки вместо этого. Статические библиотеки не копируются в ваш проект / пакеты, но могут использоваться для создания общих библиотек (см. LOCAL_STATIC_LIBRARIES и LOCAL_WHOLE_STATIC_LIBRARIES, описанные ниже).

Пример использования:

   include $(BUILD_STATIC_LIBRARY)
  

Обратите внимание, что при этом будет сгенерирован файл с именем lib$(LOCAL_MODULE).a

LOCAL_STATIC_LIBRARIES ЛОКАЛЬНЫЕ_СТАТИЧЕСКИЕ БИБЛИОТЕКИ

Список модулей статических библиотек (созданных с помощью BUILD_STATIC_LIBRARY), которые должны быть связаны с этим модулем. Это имеет смысл только в модулях общей библиотеки.

LOCAL_SHARED_LIBRARIES

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

Комментарии:

1. Спасибо за ответ. Это, конечно, процедура, но я не хочу встраивать модуль в библиотеку. Внутри есть другие переменные common.mk который будут использовать мои приложения. Так что библиотеки было бы недостаточно для моей потребности.

2. @Manty Вместо создания библиотеки вы можете просто включить common.c файл, выполнив LOCAL_SRC_FILES = ../common/common.c в обоих Android.mk .

3. Моя система немного сложна. Я не могу этого сделать. Мне нужно найти способ.

4. @Manty Итак, попробуйте обернуть функции, определенные в, common.mk некоторыми ifndef , чтобы не переопределять их.

5. Могу ли я использовать ifndef в файлах mk? Извините, я не в курсе.

Ответ №2:

В common.mk переменная, которую вы используете для назначения файлов C, использует:= вместо =.

Всякий раз, когда common.mk вызывается, он присваивает независимое значение каждому модулю