【问题标题】:Android NDK build-host-executable.mk: No such file or directoryAndroid NDK build-host-executable.mk:没有这样的文件或目录
【发布时间】:2016-01-05 10:47:52
【问题描述】:

小问题:

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

长问题:

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

我已经根据here 的说明设置了Eclipse 来构建native 部分,并将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/core 目录中没有build_host_executable.mk(周围行中声明的其他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 工具链中提取相关部分并将它们添加到包中。

【问题讨论】:

  • 如果将最新版本的 build-host-executable.mk 放入 build/core 会发生什么?
  • 也许尝试在没有 NDK 的情况下构建主机可执行文件,即使用标准 make 和 gcc?由于它们的目标不是在 Android 上运行,因此它们不能真正依赖 NDK……应该可以单独构建它们。不过,这将需要对 makefile 进行 de-Androiding...
  • @ReubenScratton 我在github.com/flyskywhy/android-ndk-r7b 有一个指向 r7b 的链接,你碰巧知道任何更高版本吗?谷歌似乎只提供当前的...
  • @ReubenScratton 我尝试了 r7b 中的文件,将 LOCAL_my 更改为 my(如 r10e build_executable.mk)。现在我得到Unknown LOCAL_MODULE_CLASS value: HOST_EXECUTABLE,显然makefile 的依赖项也被删除了。
  • @ReubenScratton 看到我对这个问题的更正,显然这个功能从来都不是 NDK 的一部分,但 AOSP 工具链必须在某个时候拥有它......

标签: android android-ndk adt


【解决方案1】:

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

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

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

  • 使用 AOSP 工具链构建本机代码(或主机目标),如 this answer 中所述。这种方法最有可能成功,因为这是为其设计包的工具链。它至少需要包含几个 GB 大小的构建工具的包。您可以获得完整的 AOSP 源代码,如 here 所述,它应该为您提供所需的所有依赖项,但这将下载大约 50 GB (!) 的数据。
  • 有一个修补版本的 NDK,它增加了对主机目标 here(或只是 make 宏 here)的支持。但是,它基于现已过时的 NDK r7b,并在 2012 年的某个时候进行了最后一次提交——您将使用一个有点异国情调且不再维护的工具链。此外,您还需要通过检查包来手动确定依赖项。
  • 放弃构建主机目标的Android.mk 文件,并使用常规的 GNU 工具链构建它们。可以在here 找到对此的介绍。您可以修改更高级别的Android.mk 来为您的主机目标调用“其他”工具链,这样您就可以自动化整个构建。如果Android.mk 的内容非常复杂,所有这一切可能需要大量工作,但这是一次性的工作,之后您的代码将使用标准工具链构建。与以前的方法一样,您需要手动确定您的依赖关系。但是,如果宿主目标所需的依赖项是移植到 Android 的标准库,那么它们可能会更容易,因为可能存在设计为使用 GNU 工具链构建的上游版本。

【讨论】:

  • 无法下载 50GB 的 ASOP。打补丁的版本能用吗
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2022-01-15
  • 2017-07-02
相关资源
最近更新 更多