我已经下载了一个自定义工具链(linaro)来构建基于ARM的Android应用程序。我如何告诉NDK使用它?我可以在Android.mk和Application.mk中定义或设置允许我这样做的东西吗?还有另一种方式吗?
答案 0 :(得分:10)
NDK makefile系统非常易于扩展,您确实可以定义不同的工具链。您需要了解Make的工作原理。
在build/core/init.mk
第261行中发现并初始化工具链(在NDKr6中,#行可能在未来版本中更改)。初始化代码在config.mk
下查找名为$(NDK_ROOT)/toolchains/*
的文件。因此,您需要将工具链添加到NDK工具链目录下的子目录中,并将config.mk
和setup.mk
添加到该子目录中。请查看toolchains/x86-4.4.3
和toolchains/arm-linux-androideabi-4.4.3
以获取示例。如果您的工具链具有标准布局,您应该能够剪切并粘贴ARM工具链config.mk
和setup.mk
。
在工具链目录中定义工具链后,您可以通过在NDK_TOOLCHAIN
文件中设置Application.mk
变量来切换到该工具链。
答案 1 :(得分:8)
正如另一个答案所提到的,工具链是由$(NDK_ROOT)/toolchains/
中的ndk-build makefile系统发现的,你可以反映你在那里看到的想法。但是有一些额外的概念可以支持非Android目标平台,虽然它们很快就会过时,因为ndk-build开始明确支持其他平台,例如mingw定位win32(或其他针对普通'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
,然后在您的平台中使用此ABI Application.mk
通过APP_ABI:= x86-win32
将其选为附加目标然后在Android.mk
文件中,您可以使用TARGET_ARCH_ABI
定义选择win32特定来源并包含路径,例如:< / p>
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
选择工具链很重要除了上面提到的ABI方法之外,你Application.mk
文件中的变量。
答案 2 :(得分:0)
好吧,您只需在Application.mk中添加“NDK_TOOLCHAIN_VERSION = 4.9”