【问题标题】:Include prebuilt static library on existing aosp module在现有 aosp 模块上包含预构建的静态库
【发布时间】:2015-10-28 10:05:07
【问题描述】:

我正在尝试将我的预构建库包含在现有的 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 source 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 包含,依赖模块应该自动将它们附加到它们的本地列表中。但是,情况并非如此,因为我收到错误:

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

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

其他信息:

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

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

有什么想法吗?

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

make: *** 没有制定目标的规则 'out/host//obj/STATIC_LIBRARIES/mylib-prebuilt_intermediates/export_includes', 需要 'out/host//obj/EXECUTABLES/dex2oat_intermediates/import_includes'。 停下来。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我终于设法让它工作了。

    我的图书馆现在位于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 混合。

    【讨论】:

    • 一年后,我再次偶然发现了这一点。这次PREBUILT_SHARED_LIBRARY又用了一次BUILD_PREBUILT
    • 这有帮助。谢谢!进一步说明,PREBUILT_STATIC_LIBRARY 未在我当前使用的 AOSP 中定义 (O)。它可能特定于 NDK。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多