android - 在 Android AOSP 中包含预构建的共享库

标签 android android-source

我想使用一些 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中,我添加了libmylibLOCAL_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

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

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

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

我可能错过了什么。有什么线索吗?

最佳答案

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

问题是 LOCAL_MODULELOCAL_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 - 在 Android AOSP 中包含预构建的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35300779/

相关文章:

c - C 中的同步回调

android - 如何编译android goldfish 3.4内核并在模拟器上运行

android - 如何在 Eclipse 中设置 Android CTS?

android - 我可以知道从 Playstore 安装了我的应用程序的用户的电子邮件 ID

android - 快速阅读联系人android

java - ActionCable(Rails5) 和安卓客户端

java - 从应用程序代码访问 Androids UpdateEngine(或其他 SystemApi 类)

android - 是否可以获得我的 Android 设备的源代码?

android - fragment 分离/重新连接与显示/隐藏

android - 如何识别 ListViewItem 以更新单行