如何告诉Android NDK使用不同的工具链



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

NDK makefile系统具有很强的可扩展性,您确实可以定义不同的工具链。您需要了解Make是如何工作的。

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

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

正如另一个答案所提到的,工具链是由ndk-build makefile系统在$(NDK_ROOT)/toolchains/中发现的,您可以在那里镜像您看到的想法。但是有一些额外的概念来支持非android目标平台,这些概念很有趣,尽管它们可能很快就会过时,因为ndk-build开始显式地支持其他平台,例如针对win32的mingw(或其他针对普通'ol linux的gcc编译器)。

In config.mk:

TOOLCHAIN_ABIS := (list of ABIs that the toolchain supports)

这是一个重要的定义,因为您可以在应用程序中使用该名称。使用特定ABI的工具链来构建。改变这个定义的用法的一个好处是,ndk-build可以同时为多个abi构建。它总是假设平台是Android,但是如果你想使用基于mingw的工具链来瞄准win32,你可以定义一个"ABI"作为x86-win32,然后在你的Application.mk中使用这个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很重要,这样除了我上面提到的ABI方法之外,还可以通过Application.mk文件中的NDK_TOOLCHAIN变量选择工具链。

那么,您可以简单地在Application.mk中添加"NDK_TOOLCHAIN_VERSION = 4.9"

最新更新