在Android AOSP

时间:2016-02-09 19:40:27

标签: android android-source

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

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

  • libmylib.so
  • Android.mk

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

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列表中)。

不幸的是,构建(lunch 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.

因此,我将PREBUILT_SHARED_LIBRARY替换为BUILD_PREBUILT(我真的不明白其中的区别):

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

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

请注意,我此时甚至不调用库,将其声明为libmedia依赖项的简单事实是有问题的。

我尝试了几个.so(包括我在平板电脑上测试过的一个二进制调用它公开的函数,直接在/data/local/tmp,所以.so没问题。< / p>

我可能错过了什么。任何线索?

1 个答案:

答案 0 :(得分:3)

我在Nexus 5上测试了同样的东西,幸运的是更详细:)

问题是LOCAL_MODULELOCAL_SRC_FILES没有使用相同的lib名称(我原来的帖子中没有这个问题,因为我想抽象细节)。

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)