简短问题:
我正在尝试使用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工具链中提取相关部件并将它们添加到包中。
答案 0 :(得分:2)
有问题的JNI依赖项来自AOSP代码树。 AOSP使用的工具链与NDK不同,尽管两者都是围绕一组GNU make宏构建的。 Android.mk
(它们的makefile等价物)的格式在两者之间有意相似,因此在许多情况下,可以使用任一工具链构建项目。
这不起作用的一种情况是主机目标,即构建要在构建主机上而不是在Android设备上运行的二进制文件(可执行文件或库)。 AOSP工具链有这种支持,但NDK没有。令人困惑的是,NDK确实有一些用于该功能的存根(包括BUILD_HOST_EXECUTABLE
和类似的定义),但缺少实现。
有三种选择。请注意,您正在构建的软件包可能依赖于AOSP源代码中的其他软件包,您也需要构建这些软件包。
Android.mk
个文件,并使用常规GNU工具链构建它们。可以找到here的介绍。您可以修改更高级Android.mk
以调用"其他"主机目标的工具链,因此您可以自动完成整个构建。如果Android.mk
内容非常复杂,那么所有这些都可能是很多工作,但这是一次性的努力,之后您的代码将使用标准工具链构建。与之前的方法一样,您需要手动确定依赖项。但是,如果它们是移植到Android的标准库,那么主机目标所需的依赖关系可能会更容易,因为可能存在一个设计用GNU工具链构建的上游版本。