Подтвердить что ты не робот

Как сообщить Android NDK использовать другую инструментальную цепочку

Я загрузил пользовательскую инструментальную цепочку (linaro) для создания Android-приложений на базе ARM. Как сообщить NDK об этом? Могу ли я определить или установить что-то в Android.mk и Application.mk, что позволит мне это сделать? Есть ли другой способ?

4b9b3361

Ответ 1

Как упоминается в другом ответе, инструментальные цепочки обнаруживаются системой makefile ndk-build в $(NDK_ROOT)/toolchains/, и вы можете отражать идеи, которые там видите. Но есть несколько дополнительных концепций для поддержки целевых платформ, отличных от Android, которые интересны, хотя они могут скоро устаревать, поскольку ndk-build начинает явно поддерживать другие платформы, такие как mingw-таргетинг win32 (или другие компиляторы gcc, нацеленные на простой Linux-сервер).

В config.mk:

TOOLCHAIN_ABIS := (list of ABIs that the toolchain supports)

Это важное определение, потому что вы можете использовать это имя в своем Application.mk для сборки с использованием инструментальной цепочки для конкретного ABI. Одним из преимуществ искажения использования этого определения является то, что ndk-build может одновременно создавать несколько ABI. Он всегда предполагает, что платформа Android, но если вы хотите нацелить win32 с помощью инструментальной цепочки на основе mingw, вы можете определить "ABI" как x86-win32, а затем использовать этот ABI в своем Application.mk, чтобы выбрать его как дополнительный target через APP_ABI:= x86-win32 Затем в ваших файлах Android.mk вы можете использовать определение TARGET_ARCH_ABI, чтобы выбрать источники данных Win32 и включить пути, например:

ifeq ($(TARGET_ARCH_ABI),x86-win32)
  LOCAL_SRC_FILES += my_win32_file.c
  LOCAL_CFLAGS += -DSOME_WIN32_SPECIFIC
endif

Последняя часть состоит в том, что в setup.mk для вашей инструментальной цепочки может быть недостаточно взглянуть на другие инструментальные цепочки в качестве примеров, потому что для setup.mk для конкретной инструментальной цепочки действительно выполняется переопределение настроек сборки в default-build-commands.mk, так что вы хотите это проверить этот файл и переопределить в нем вещи, которые вам не нравятся.

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

# These flags are used to enforce the NX (no execute) security feature in the
# generated machine code. This adds a special section to the generated shared
# libraries that instruct the Linux kernel to disable code execution from
# the stack and the heap.
TARGET_NO_EXECUTE_CFLAGS  := # our platform doesn't support this flag!
TARGET_NO_EXECUTE_LDFLAGS := # our platform doesn't support this flag!

# These flags disable the above security feature
TARGET_DISABLE_NO_EXECUTE_CFLAGS  :=  # our platform doesn't support this flag!
TARGET_DISABLE_NO_EXECUTE_LDFLAGS :=  # our platform doesn't support this flag!

Это всего лишь один из примеров многих функций в default-build-commands.mk, которые, возможно, необходимо переопределить, и, конечно же, важно предоставить TOOLCHAIN_NAME, чтобы инструментальная цепочка была выбрана с помощью переменной NDK_TOOLCHAIN внутри вашего Application.mk файл в дополнение к методологии ABI, о которой я упоминал выше.

Ответ 2

Система makefile NDK довольно расширяема, и вы действительно можете определить другую инструментальную цепочку. Вам нужно некоторое понимание того, как работает Make.

Инструментальные цепочки обнаружены и инициализированы в строке build/core/init.mk линии 261 (в NDKr6 строка # может измениться в будущих версиях). Код инициализации ищет файлы с именем config.mk под $(NDK_ROOT)/toolchains/*. Поэтому вам нужно добавить свою инструментальную цепочку в подкаталог под каталогом NDK toolchains и добавить в этот подкаталог config.mk и setup.mk. Посмотрите примеры toolchains/x86-4.4.3 и toolchains/arm-linux-androideabi-4.4.3. Вы должны иметь возможность вырезать и вставлять toolchain ARM config.mk и setup.mk, если ваша toolchain имеет стандартную компоновку.

Как только вы определили инструментальную цепочку в каталоге инструментальной цепочки, вы можете переключиться на нее, установив переменную NDK_TOOLCHAIN внутри вашего файла Application.mk.

Ответ 3

ну, вы можете просто добавить "NDK_TOOLCHAIN_VERSION = 4.9" в свой Application.mk