2011-07-07 37 views
23

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

+0

你做这在Ubuntu?你是如何安装工具链的? – corbin

回答

8

至于其他的答案中提到,工具链由NDK建造的makefile系统$(NDK_ROOT)/toolchains/发现,并可以反映你看到有想法。但是有一些额外的概念可以支持非Android目标平台,虽然它们可能很快就会过时,因为ndk-build开始明确支持其他平台,比如针对win32的mingw(或其他针对纯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,然后在你的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变量来选择工具链。

10

的NDK生成文件系统是很容易扩展,你的确可以定义不同的工具链。您需要了解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变量来切换到该工具链。

0

好了,你可以简单地添加 “NDK_TOOLCHAIN_VERSION = 4.9” 在您的Application.mk

相关问题