其他分享
首页 > 其他分享> > 在Android AOSP中包括预构建的共享库

在Android AOSP中包括预构建的共享库

作者:互联网

我想使用一些AOSP代码中的预构建共享库(我们称为libmylib.so),例如在framework / av / media / libmedia文件夹中.

由于我的目标是Nexus 7,因此我创建了一个新文件夹device / asus / flo / mylib,在其中放置了2个文件:

> libmylib.so
> Android.mk

我的第一次尝试是在Android.mk中使用PREBUILT_SHARED_LIBRARY,如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmylib
LOCAL_SRC_FILES := libmylib.so
include $(PREBUILT_SHARED_LIBRARY)

然后,我在libmedia模块中添加了依赖项(在framework / av / media / libmedia / Android.mk中,我将libmylib添加到了LOCAL_SHARED_LIBRARIES列表中).

不幸的是,构建(午餐aosp_flo-eng&& make -j4)失败了:

*** No rule to make target `out/target/product/flo/obj/SHARED_LIBRARIES/libmylib_intermediates/export_includes’, needed by `out/target/product/flo/obj/SHARED_LIBRARIES/libmedia_intermediates/import_includes’. Stop.

因此,我用BUILD_PREBUILT替换了PREBUILT_SHARED_LIBRARY(我不太了解其中的区别):

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmylib
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_SRC_FILES := libmylib.so
include $(BUILD_PREBUILT)

这样,构建成功.

因此,我闪烁了图像:

fastboot flashall -w

但不幸的是,平板电脑无法启动. adb logcat无限打印:

E SurfaceFlinger: error posting framebuffer: -22
E qdgralloc: fb_post: FBIOPUT_VSCREENINFO for primary failed, str: Invalid argument
E SurfaceFlinger: error posting framebuffer: -22
E qdgralloc: fb_post: FBIOPUT_VSCREENINFO for primary failed, str: Invalid argument
E SurfaceFlinger: error posting framebuffer: -22
E qdgralloc: fb_post: FBIOPUT_VSCREENINFO for primary failed, str: Invalid argument

如果我从framework / av / media / libmedia / Android.mk中删除libmylib,一切正常,平板电脑可以正常启动.

注意,我现在甚至没有调用该库,将其声明为libmedia依赖项这一简单事实是有问题的.

我尝试了几种.so(包括我在平板电脑上使用二进制调用的函数测试的函数,该函数直接在/ data / local / tmp中,因此.so可以).

我可能错过了一些东西.有什么线索吗?

解决方法:

我在Nexus 5上测试了同样的东西,幸运的是,它更加冗长:)

问题是LOCAL_MODULE和LOCAL_SRC_FILES没有使用相同的库名(这个问题在我的原始文章中没有出现,因为我想抽象细节).

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmylib
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_SRC_FILES := libsomething.so
include $(BUILD_PREBUILT)

该模块为libmylib,但源文件为libsomething.so.

这样,就存在一个/system/lib/libsomething.so,但是dlopen()失败了,因为找不到/system/lib/libmylib.so.

两者使用相同的名称可以解决此问题:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libsomething
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_SRC_FILES := libsomething.so
include $(BUILD_PREBUILT)

标签:android-source,android
来源: https://codeday.me/bug/20191119/2033190.html