Android NDK build-host-executable.mk: 没有那个文件或目录

Android NDK build-host-executable.mk: No such file or directory

小问题:

我正在尝试使用 Eclipse ADT 和 NDK r10e(当前版本)构建一个具有 JNI 依赖项的应用程序。 JNI 依赖项(显然)使用 NDK 中的 build-host-executable.mk 在构建主机上构建了一个 运行 的二进制文件。但是,该脚本似乎已在最近的 NDK 版本中删除。我该怎么办?

长问题:

JNI 依赖是来自 AOSP 的 platform/external/srec,它带有一个 Android.mk 文件(实际上,其中有几个)。

我已经根据说明 here 设置了 Eclipse 来构建本机部分,并将 JNI 代码树复制到我的应用程序源代码树的 jni 目录中。此外,我必须编辑 jni/Android.mk,添加以下行:

export TARGET_BUILD_TYPE := debug

据我了解,这将由 AOSP 工具链设置,但在从 Eclipse 构建时未设置。

但是,我收到以下错误:

android-ndk-r10e/build/core/build-host-executable.mk: No such file or directory

这是由我的一个 Android.mk 文件中的一行引起的:

include $(BUILD_HOST_EXECUTABLE)

NDK在build/core/build-all.mk中定义了BUILD_HOST_EXECUTABLE:

BUILD_HOST_EXECUTABLE     := $(BUILD_SYSTEM)/build-host-executable.mk

但是,build_host_executable.mk 不在 build/core 目录中(周围行中声明的其他 build-host-*.mk 脚本也是如此)。

谷歌搜索了一下,我发现这个脚本似乎已经存在于早期的 NDK 版本中(至少 NDK r7 r7b)但似乎在以后的版本中不存在(可能从 r10b 开始)。 JNI 库被(现已废弃的)语音拨号应用程序使用。它最后一次提交是在 2014 年 12 月,尽管最后一次真正的代码更改可能是在 2014 年 6 月。AOSP 已在 2015 年 6 月停止构建它。将此与 NDK 发布历史进行比较,它可能永远不会针对晚于 NDK 版本构建r9d 或者 r10.

我发现的 NDK r7b 似乎是添加了主机目标支持的补丁版本,另请参见 https://github.com/flyskywhy/android-ndk-host。看起来在 NDK 中计划对此提供支持并添加了一些存根,但从未完全实现。这让我可以选择是使用本地工具链构建主机内容,还是修补 NDK r10e 以添加主机目标支持。

另一方面,这个包已经成为 AOSP 的一部分已有一段时间(Cyanogenmod 包含它直到 KitKat 并将其放入 Lollipop),因此 AOSP 工具链一定能够构建它。任何指向该工具链的指针?也许可以从AOSP工具链中提取相关部分并将它们添加到包中。

有问题的 JNI 依赖项取自 AOSP 代码树。 AOSP 使用的工具链不同于 NDK,尽管两者都是围绕一组 GNU make 宏构建的。 Android.mk(它们的 makefile 等价物)的格式在两者之间有意相似,因此在许多情况下,可以使用任一工具链构建项目。

一种情况下这将不起作用是主机目标,即构建二进制文件(可执行文件或库)旨在 运行 在构建主机上而不是在 Android 设备上。 AOSP 工具链有这种支持,但 NDK 没有。令人困惑的是,NDK 确实有一些该功能的存根(包括 BUILD_HOST_EXECUTABLE 和类似的定义)但缺少实现。

共有三个选项。请注意,您正在构建的包可能依赖于 AOSP 源代码中的其他包,您也需要构建这些包。

  • 使用 AOSP 工具链构建本机代码(或主机目标),如 . This approach is most likely to be successful, as this is the toolchain for which the package was designed. It requires at least the packages containing the build tools, which are several gigabytes in size. You can get the entire AOSP source code as described here 中所述,它应该为您提供所需的所有依赖项,但这将下载大约 50 GB (!)数据。
  • NDK 有一个补丁版本,它增加了对主机目标的支持here (or just the make macros here)。但是,它基于 now-outdated NDK r7b,最后一次提交是在 2012 年的某个时候——您将使用一个有点奇特且不再维护的工具链。此外,您需要通过检查包手动确定依赖项。
  • 放弃构建主机目标的 Android.mk 文件,并使用常规 GNU 工具链构建这些文件。可以找到关于它的介绍 here。您可以修改 higher-level Android.mk 来为您的主机目标调用 "other" 工具链,这样您就可以自动化整个构建。如果 Android.mk 内容非常复杂,所有这些工作可能会很多,但这是 one-time 的工作,之后您的代码将使用标准工具链构建。与以前的方法一样,您需要手动确定依赖项。但是,如果它们是移植到 Android 的标准库,那么主机目标所需的依赖项可能会更容易,因为可能有一个设计为使用 GNU 工具链构建的上游版本。