我正在尝试将我的预建库包含在现有的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`中找到),因为我想将特定的编译标志传递给单个源文件。
我已经尝试过,但未能找到其他问题的解决方案,here和here。
有什么想法吗?
编辑: 当我尝试进行完整构建时,出现以下错误:
制作:***没有制定目标的规则 '出来/主机// OBJ / STATIC_LIBRARIES / MYLIB-prebuilt_intermediates / export_includes', 需要的 '出/主机// OBJ /可执行文件/ dex2oat_intermediates / import_includes'。 停止。
谢谢!
答案 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
混合使用