如何在AOSP项目中使用我的预构建c ++静态/共享库

问题描述 投票:2回答:1

我想使用我的静态或共享预建库libmylib.so or libmylib.a。我的构建目标是Hikey960设备。我成功构建了纯aosp项目,并刷新到Hikey960设备。接下来,我要使用/frameworks/av/media/libaudioclient/AudioTrack.cpp修改libmylib.so

Setp 1

我将mylib目录创建到/system,并复制了预构建的库。

|-- Andoird.mk
|-- arm64-v8a
|   |-- shared
|   |   `-- Release
|   |       `-- libmylib.so
|   `-- static
|       `-- Release
|           `-- libmylib.a
|-- armeabi
|   |-- shared
|   |   `-- Release
|   |       `-- libmylib.so
|   `-- static
|       `-- Release
|           `-- libmylib.a
|-- armeabi-v7a
|   |-- shared
|   |   `-- Release
|   |       `-- libmylib.so
|   `-- static
|       `-- Release
|           `-- libmylib.a
|-- include
|   `-- mylib.h
|-- x86
|   |-- shared
|   |   `-- Release
|   |       `-- libmylib.so
|   `-- static
|       `-- Release
|           `-- libmylib.a
`-- x86_64
    |-- shared
    |   `-- Release
    |       `-- libmylib.so
    `-- static
        `-- Release
            `-- libmylib.a

步骤2

我如下在Android.mk中创建了/system/mylib文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := system/mylib/$(TARGET_ARCH_ABI)/shared/Release/libmylib.so
LOCAL_EXPORT_C_INCLUDES:= include
include $(PREBUILT_SHARED_LIBRARY)

步骤3

我如下将libmylib行插入shared_libs: [中的frameworks/av/media/libaudioclient/Android.bp

cc_library_shared {
    name: "libaudioclient",

    aidl: {
        export_aidl_headers: true,
        local_include_dirs: ["aidl"],
        include_dirs: [
            "frameworks/av/media/libaudioclient/aidl",
        ],
    },

    srcs: [
        // AIDL files for audioclient interfaces
        // The headers for these interfaces will be available to any modules that
        // include libaudioclient, at the path "aidl/package/path/BnFoo.h"
        ":libaudioclient_aidl_private",
        ":libaudioclient_aidl",

        "AudioEffect.cpp",
        "AudioRecord.cpp",
        "AudioSystem.cpp",
        "AudioTrack.cpp",
        "AudioTrackShared.cpp",
        "IAudioFlinger.cpp",
        "IAudioFlingerClient.cpp",
        "IAudioPolicyService.cpp",
        "IAudioPolicyServiceClient.cpp",
        "IAudioTrack.cpp",
        "IEffect.cpp",
        "IEffectClient.cpp",
        "ToneGenerator.cpp",
        "PlayerBase.cpp",
        "RecordingActivityTracker.cpp",
        "TrackPlayerBase.cpp",
    ],
    shared_libs: [
        "libaudiofoundation",
        "libaudioutils",
        "libaudiopolicy",
        "libaudiomanager",
        "libbinder",
        "libcutils",
        "libdl",
        "liblog",
        "libmedia_helper",
        "libmediametrics",
        "libmediautils",
        "libnblog",
        "libprocessgroup",
        "libutils",
        "libvibrator",
        "libmylib",
    ],
    export_shared_lib_headers: ["libbinder"],

    local_include_dirs: ["include/media", "aidl"],
    header_libs: [
        "libaudioclient_headers",
        "libbase_headers",
        "libmedia_headers",
    ],
    export_header_lib_headers: ["libaudioclient_headers"],

    // for memory heap analysis
    static_libs: [
        "libc_malloc_debug_backtrace",
    ],
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-error=deprecated-declarations",
    ],
    sanitize: {
        misc_undefined : [
            "unsigned-integer-overflow",
            "signed-integer-overflow",
        ],
    },
}

输出

不幸的是,构建失败:

error: frameworks/av/media/libaudioclient/Android.bp:39:1: "libaudioclient" depends on undefined module "libmylib"
06:32:39 soong bootstrap failed with: exit status 1

我认为在构建aosp时不包括我的预构建库文件。如何将我的库包含到aosp构建中。我应该在哪里指定mylib?

而且我认为现在使用soong作为内置工具,而不是aosp中的nkd-build,所以我应该将上面创建的Android.mk文件更改为Android.bp吗?

如果您知道我的错误步骤,请告诉我该怎么做。谢谢。

android android-source
1个回答
0
投票

模块命名

您的库的明显问题是它的名称。

Android不会自动在库名前添加lib。您必须将lib模块重命名为libmylib

LOCAL_MODULE := libmylib

模块查找逻辑

由于您的问题仍然存在,因此了解Android如何查找模块定义以使您可以进一步调试问题可能会有所帮助:

Android.mk查找

Android将递归遍历$ANDROID_BUILD_TOP的每个子目录,直到找到第一个Android.mk。子目录中的任何Android.mk必须显式包含在父目录Android.mk的包含中。

示例:

include $(call all-subdir-makefiles)

Android.bp查找

Android.bp的搜索工作有所不同(自Android Pie起),因为查找不会在第一个找到的Android.bp处停止。因此,不再需要显式包含子目录。

列出所有找到的模块

要检查构建系统是否找到了新添加的模块,可以调用m modules,它将列出所有找到的模块定义名称。

m modules
© www.soinside.com 2019 - 2024. All rights reserved.