25

我已经下载了一个自定义工具链 ( linaro ) 来构建基于 ARM 的 Android 应用程序。我如何告诉 NDK 使用它?我可以在 Android.mk 和 Application.mk 中定义或设置一些允许我这样做的东西吗?还有其他方法吗?

4

3 回答 3

10

NDK makefile 系统非常可扩展,您确实可以定义不同的工具链。您需要对 Make 的工作原理有所了解。

工具链在第 261 行被发现并初始化build/core/init.mk(在 NDKr6 中,# 行可能会在未来版本中更改)。初始化代码查找名为config.mk. $(NDK_ROOT)/toolchains/*因此,您需要将工具链添加到 NDK 工具链目录下的子目录中,并在该子目录中添加一个config.mksetup.mk。查看toolchains/x86-4.4.3toolchains/arm-linux-androideabi-4.4.3示例。如果您的工具链具有标准布局,您应该能够剪切和粘贴 ARM 工具config.mk链。setup.mk

在工具链目录中定义工具链后,您可以通过在文件中设置NDK_TOOLCHAIN变量来切换到它。Application.mk

于 2011-08-16T17:38:10.087 回答
9

正如其他答案所提到的,工具链是由 ndk-build makefile system 发现的$(NDK_ROOT)/toolchains/,您可以反映您在那里看到的想法。但是有一些额外的概念可以支持非 Android 目标平台,虽然它们可能很快就会过时,因为 ndk-build 开始明确支持其他平台,例如针对 win32 的 mingw(或针对普通 '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其选择为附加目标您可以使用定义来选择 win32 特定的源并包含路径,例如:APP_ABI:= x86-win32Android.mkTARGET_ARCH_ABI

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

于 2013-03-01T16:57:45.907 回答
0

好吧,您可以在 Application.mk 中简单地添加“NDK_TOOLCHAIN_VERSION = 4.9”

于 2017-07-31T07:09:10.320 回答