Peter M..
8
正如另一个答案所提到的,工具链是由ndk-build makefile系统发现的$(NDK_ROOT)/toolchains/,你可以反映你在那里看到的想法.但是有一些额外的概念可以支持非Android目标平台,虽然它们很快就会过时,因为ndk-build开始明确支持其他平台,例如mingw定位win32(或其他针对普通'ol linux的gcc编译器) .
在config.mk:
TOOLCHAIN_ABIS := (list of ABIs that the toolchain supports)
这是一个重要的定义,因为您可以在Application.mk中使用此名称来使用特定ABI的工具链进行构建.破坏此定义使用的一个好处是,ndk-build可以同时为多个ABI构建.它总是假设平台是Android,但是如果你想使用基于mingw的工具链来定位win32,你可以将"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可能需要覆盖的许多功能的一个示例,当然,除了上面提到的ABI方法之外,提供TOOLCHAIN_NAME工具链以便通过文件中的NDK_TOOLCHAIN变量进行选择是很重要的Application.mk.