android - 有没有办法强制 Android ndk 静态库之间的构建顺序?

标签 android android-ndk

我们有一个相当大的项目,为 Windows、Android 和 iOS 构建,我正在尝试并行化 android 构建。由于历史原因,在构建期间,所有 header 都导出到单个目录,并且它们的包含路径也基于此单个目录。这意味着如果模块 A 依赖于模块 B,那么它期望模块 B 复制出自己的 header 。

根据 NDK 文档,NDK make 脚本会忽略静态库之间的依赖关系,除了确定动态库的传递依赖关系之外,但由于我们只构建静态库,这对我们没有帮助。

我想我可以使用 LOCAL_EXPORT_C_INCLUDES导出适当的路径,它会起作用,除了某些模块将 header 导出到与存储库中存在的 header 不同的路径下。

视觉辅助:

.
|-- Output
|   |-- Android
|       |-- includes/Foo/Bar
|-- Foo
|   |-- Bar
|   |   |-- Android
|   |   |   |-- stuff.h
|   |   |-- Windows
|   |   |   |-- stuff.h
...

一个文件qux.cpp将包含标题 stuff.h#include <Foo/Bar/stuff.h> ,一次有效 stuff.h位于 Output文件夹,但无法在stuff.h时工作位于Foo/Bar/Android

最佳答案

毕竟,ndk-build 是 GNU make 的包装。这使您能够强制执行依赖关系。

这里我们将滥用ndk-build的PCH功能。如果您在库中使用 PCH,则需要不同的解决方法。

假设我们有两个静态库,libS2.a应该在libS1.a之后编译。您将对 Android.mk 文件进行一些修改:

…
include $(CLEAR_VARS)
LOCAL_MODULE    := S1
LOCAL_SRC_FILES := …
include $(BUILD_STATIC_LIBRARY)              # builds libS1.a

FIRST_LIBRARY := $(LOCAL_BUILT_MODULE)       #### added #1

include $(CLEAR_VARS)
LOCAL_MODULE    := S2
LOCAL_PCH       := pch.h                     #### added #2
LOCAL_SRC_FILES := …
include $(BUILD_STATIC_LIBRARY)              # builds libS2.a

$(LOCAL_PATH)/$(LOCAL_PCH): $(FIRST_LIBRARY) #### added #3
    touch $@                                 #### added #4, starts with TAB

如您所见,我们只添加了 4 行。不要错过 touch 之前的 TAB 字符。

为了使这个技巧发挥作用,重要的是第一个库放置在第二个库之前。

关于android - 有没有办法强制 Android ndk 静态库之间的构建顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34250439/

相关文章:

android - Android Studio 中是否有任何插件可以创建 Layout Sub 文件夹?

android - 如何在 Gradle 中设置预处理器定义

java - Android NDK、JNI、蓝牙 : Designing the Android Application which is having C++ source code/library with Bluetooth APIs/methods , 使用 JNI

java - 如何在 Android 中使用 PHP MYSQL 更新数据

安卓 NDK 和 C++ STL

java - 蓝牙 4.0 设备可以向蓝牙 2.0 设备发送数据吗?

Android NDK 调试失败 "Unable to detect application ABI's”

java - 谷歌云消息和 MySQL 数据库

java - Quickblox requestBuilder [或]

android - Fabric : "We are building your audience insights. Please update to the latest version of Crashlytics Kit.."