在现有的 aosp 模块上包含预构建的静态库

Include prebuilt static library on existing aosp module

我正在尝试将我的预构建库包含在现有 Android 模块 art/runtime/ 中。我按照官方文档,发现here。详细来说,这些是我所做的更改:

在 art/Android.mk 中添加了行:

# This makes sure my library's .mk is found
include $(art_path)/mylib/Android.mk

在 art/runtime/Android.mk:

中添加了行
# Added this, after the LOCAL_C_INCLUDES
LOCAL_STATIC_LIBRARIES := mylib-prebuilt
# Also, on the next mention of LOCAL_STATIC_LIBRARIES, I changed the
# assignment operator to '+=', so mylib won't overriden

包含在 art/runtime.cc 源 mylib 的 header:

#include "mylib.h"
// then at some point use it

我已将 mylib 个来源放入 art/mylib。我使用常规 Makefile 手动构建存档 libmylib.a,我想将其静态 linked 为 libart.so

art/mylib 找到的 Android.mk 我添加了以下内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib-prebuilt
LOCAL_SRC_FILES := $(LOCAL_PATH)/libmylib.a
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/mylib.h \
$(LOCAL_PATH)/another_header.h

include $(PREBUILT_STATIC_LIBRARY)

通过导出 C 包含,依赖模块应该已经自动将它们附加到它们的本地列表中。但是,情况并非如此,因为我收到错误:

fatal error: 'mylib.h' file not found

如果我解决这个问题,用我真的不应该的愚蠢方法,我偶然发现了一个 link 错误,因为我的 libmylib.a 在 linking 期间从未使用过.

其他信息:

我已将 mylib 放在 art/mylib 中,因为它将成为 art namespace 的一部分,并且其方法将被 calling/being 由 art/runtime 来源调用,例如runtime.cc。我选择使用 prebuilt-libraries,而不是直接包含我的源代码,例如垃圾收集器(位于 art/runtime/gc`),因为我想将特定的编译标志传递给各个源文件。

我已经尝试过,但失败了,找到了其他问题的解决方案 here and here

有什么想法吗?

编辑: 当我尝试进行完整构建时,出现以下错误:

make: *** No rule to make target 'out/host//obj/STATIC_LIBRARIES/mylib-prebuilt_intermediates/export_includes', needed by 'out/host//obj/EXECUTABLES/dex2oat_intermediates/import_includes'. Stop.

谢谢!

我终于成功了。

我的图书馆现在位于 art/runtime/mylib

art/runtime/Android.mk 中,我包含以下来源:

LOCAL_C_INCLUDES += art/runtime/mylib

这使得 mylib.h 对运行时源文件可见。

art/runtime/mylib/Android.mk 几乎完全更改为:

LOCAL_MODULE := libmylib
LOCAL_SRC_FILES := libmylib.a
LOCAL_MODULE_SUFFIX := .a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
include $(BUILD_PREBUILT)

在我之前的尝试中,LOCAL_EXPORT_C_INCLUDES,与文档相反,它没有将文件复制到相关模块。另外 PREBUILT_STATIC_LIBRARY 似乎没有用。

现在,我可以在对象存档中构建我的库,使用常规 makefile,构建系统会在每次更改到适当位置时复制它,因此在 link 阶段可以混合libart.so.