【发布时间】: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(如 r10ebuild_executable.mk)。现在我得到Unknown LOCAL_MODULE_CLASS value: HOST_EXECUTABLE,显然makefile 的依赖项也被删除了。 -
@ReubenScratton 看到我对这个问题的更正,显然这个功能从来都不是 NDK 的一部分,但 AOSP 工具链必须在某个时候拥有它......
标签: android android-ndk adt