【发布时间】:2011-09-30 15:42:23
【问题描述】:
我已经下载了一个自定义工具链 (linaro) 来构建基于 ARM 的 Android 应用程序。我如何告诉 NDK 使用它?我可以在 Android.mk 和 Application.mk 中定义或设置一些允许我这样做的东西吗?还有其他方法吗?
【问题讨论】:
-
你是在 Ubuntu 上做的吗?你是如何安装工具链的?
标签: android android-ndk toolchain
我已经下载了一个自定义工具链 (linaro) 来构建基于 ARM 的 Android 应用程序。我如何告诉 NDK 使用它?我可以在 Android.mk 和 Application.mk 中定义或设置一些允许我这样做的东西吗?还有其他方法吗?
【问题讨论】:
标签: android android-ndk toolchain
NDK 的 makefile 系统非常可扩展,您确实可以定义不同的工具链。您需要对 Make 的工作原理有所了解。
在build/core/init.mk 第 261 行发现和初始化工具链(在 NDKr6 中,行 # 可能会在未来版本中更改)。初始化代码在$(NDK_ROOT)/toolchains/* 下查找名为config.mk 的文件。因此,您需要将工具链添加到 NDK 工具链目录下的子目录中,并在该子目录中添加 config.mk 和 setup.mk。以toolchains/x86-4.4.3 和toolchains/arm-linux-androideabi-4.4.3 为例。如果您的工具链具有标准布局,您应该能够剪切和粘贴 ARM 工具链 config.mk 和 setup.mk。
在工具链目录中定义工具链后,您可以通过在Application.mk 文件中设置NDK_TOOLCHAIN 变量来切换到它。
【讨论】:
正如另一个答案所提到的,工具链是由$(NDK_ROOT)/toolchains/ 中的 ndk-build makefile 系统发现的,您可以反映您在那里看到的想法。但是有一些额外的概念可以支持非 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,然后在您的 @987654325 中使用此 ABI @ 通过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 方法之外的文件。
【讨论】:
好吧,你可以简单地在你的Application.mk中添加“NDK_TOOLCHAIN_VERSION = 4.9”
【讨论】: