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

Pas*_*lis 0 android android-ndk android-build android-source

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

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

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

在 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
Run Code Online (Sandbox Code Playgroud)

包含在art/runtime.cc源 mylib 的头文件中:

#include "mylib.h"
// then at some point use it
Run Code Online (Sandbox Code Playgroud)

我已经把mylib来源放在art/mylib. 我使用常规 Makefile 手动构建存档libmylib.a,我希望将其静态链接到libart.so.

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

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)
Run Code Online (Sandbox Code Playgroud)

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

致命错误:找不到“mylib.h”文件

如果我以一种我真的不应该使用的愚蠢方式解决此问题,libmylib.a则会偶然发现链接错误,因为在链接期间从未使用过 my 。

其他信息:

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

我已经尝试过,但失败了,其他问题的解决方案,在这里这里找到。

有什么想法吗?

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

make: *** 没有规则可以制作目标 'out/host//obj/STATIC_LIBRARIES/mylib-prebuilt_intermediates/export_includes',需要 'out/host//obj/EXECUTABLES/dex2oat_intermediates/import_includes'。停止。

谢谢!

Pas*_*lis 5

我终于设法让这个工作。

我的图书馆现在放在art/runtime/mylib.

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

LOCAL_C_INCLUDES += art/runtime/mylib
Run Code Online (Sandbox Code Playgroud)

这使得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)
Run Code Online (Sandbox Code Playgroud)

在我之前的尝试中,LOCAL_EXPORT_C_INCLUDES与文档相反,它没有将文件复制到依赖模块。也PREBUILT_STATIC_LIBRARY似乎没有工作。

现在,我可以使用常规的 makefile 在对象存档中构建我的库,并且构建系统每次将其更改到适当的位置时都会将其复制,因此在链接阶段可以与libart.so.

  • 一年后,我再次偶然发现了这一点。这次`PREBUILT_SHARED_LIBRARY`再次使用`BUILD_PREBUILT`! (2认同)