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