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

Phonon 09/02/2017. 3 answers, 18.326 views
android android android-ndk android-ndk toolchain

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

1 Comments
corbin 03/08/2012
你在Ubuntu上做过这些吗? 你是如何安装工具链的?

3 Answers


Peter M 03/01/2013.

正如其他答案所提到的,工具链是通过$(NDK_ROOT)/toolchains/的ndk-build makefile系统发现的,您可以在那里看到您看到的想法。 但是有一些额外的概念可以支持非Android目标平台,虽然它们可能很快就会过时,因为ndk-build开始明确支持其他平台,比如针对win32的mingw(或其他针对纯Linux的gcc编译器) 。

config.mk

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

这是一个重要的定义,因为您可以在您的Application.mk中使用此名称来构建使用特定ABI的工具链。 破坏这个定义的使用的好处之一是,ndk-build可以同时为多个ABI构建。 它always假设平台是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 really会覆盖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以便可以通过Application.mk文件中的NDK_TOOLCHAIN变量选择工具链到我上面提到的ABI方法。


Ian Ni-Lewis 09/12/2013.

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变量来切换工具链。


lily 07/31/2017.

那么,你可以简单地在你的Application.mk中添加“NDK_TOOLCHAIN_VERSION = 4.9”

Related questions

Hot questions

Language

Popular Tags