Как указать Android NDK использовать другой набор инструментов - PullRequest
23 голосов
/ 07 июля 2011

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

Ответы [ 3 ]

10 голосов
/ 16 августа 2011

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

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

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

8 голосов
/ 01 марта 2013

Как упоминается в другом ответе, наборы инструментов обнаруживаются системой make-файлов 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 чтобы выбрать его в качестве дополнительной цели с помощью 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, о которой я упоминал выше.

0 голосов
/ 31 июля 2017

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

...