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

时间:2015-10-28 10:05:08

标签: android android-ndk android-source android-build

我正在尝试将我的预建库包含在现有的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的标题中:

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

我已将mylib来源放入art/mylib。我使用常规Makefile手动构建归档libmylib.a,我想将其静态链接到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 includes,依赖模块应该自动将它们附加到本地列表。但是,情况并非如此,因为我收到错误:

  

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

如果我以一种我真的不应该采用的愚蠢方式解决这个问题,我会偶然发现一个链接错误,因为在链接过程中从不使用libmylib.a

其他信息:

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

我已经尝试过,但未能找到其他问题的解决方案,herehere

有什么想法吗?

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

  

制作:***没有制定目标的规则   '出来/主机// OBJ / STATIC_LIBRARIES / MYLIB-prebuilt_intermediates / export_includes',   需要的   '出/主机// OBJ /可执行文件/ dex2oat_intermediates / import_includes'。   停止。

谢谢!

1 个答案:

答案 0 :(得分:4)

我终于设法让它发挥作用。

我的图书馆现在位于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在对象存档中构建我的库,并且构建系统每次将其更改为适当的位置时都会复制它,因此在链接阶段可以与libart.so混合使用