Android NDK build-host-executable.mk:没有这样的文件或目录

时间:2016-01-05 10:47:52

标签: android android-ndk adt

简短问题:

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

长问题:

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

我已经设置了Eclipse来根据指令here构建本机部分,并将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_HOST_EXECUTABLE中定义build/core/build-all.mk

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

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

谷歌搜索了一下,我发现这个脚本似乎已经存在于早期的NDK版本中(至少NDK r7 r7b)但似乎在以后的版本中不存在(可能是因为r10b)。 JNI lib被(现已放弃的)Voice Dial应用程序使用。它在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工具链中提取相关部件并将它们添加到包中。

1 个答案:

答案 0 :(得分:2)

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

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

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

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