【问题标题】:How to tell Android NDK to use a different toolchain如何告诉 Android NDK 使用不同的工具链
【发布时间】:2011-09-30 15:42:23
【问题描述】:

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

【问题讨论】:

  • 你是在 Ubuntu 上做的吗?你是如何安装工具链的?

标签: android android-ndk toolchain


【解决方案1】:

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 变量来切换到它。

【讨论】:

    【解决方案2】:

    正如另一个答案所提到的,工具链是由$(NDK_ROOT)/toolchains/ 中的 ndk-build makefile 系统发现的,您可以反映您在那里看到的想法。但是有一些额外的概念可以支持非 Android 目标平台,虽然它们可能很快就会过时,因为 ndk-build 开始明确支持其他平台,例如针对 win32 的 mingw(或针对普通 '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,然后在您的 @987654325 中使用此 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 很重要,这样可以通过NDK_TOOLCHAIN 变量在Application.mk 中选择工具链除了我上面提到的 ABI 方法之外的文件。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-14
        • 2012-02-25
        • 2021-06-12
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-01
        相关资源
        最近更新 更多