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

Pho*_*non 23 android toolchain android-ndk

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

Ian*_*wis 10

NDK makefile系统是可扩展的,您确实可以定义不同的工具链.您需要了解Make的工作原理.

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

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


Pet*_*r 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)
Run Code Online (Sandbox Code Playgroud)

这是一个重要的定义,因为您可以在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
Run Code Online (Sandbox Code Playgroud)

最后一点是,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!
Run Code Online (Sandbox Code Playgroud)

这只是default-build-commands.mk可能需要覆盖的许多功能的一个示例,当然,除了上面提到的ABI方法之外,提供TOOLCHAIN_NAME工具链以便通过文件中的NDK_TOOLCHAIN变量进行选择是很重要的Application.mk.