在Android AOSP中包括预构建的共享库 [英] Include prebuilt shared library in Android AOSP

查看:121
本文介绍了在Android AOSP中包括预构建的共享库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I would like to use a prebuilt shared library (let's call it libmylib.so) from some AOSP code, for instance in the folder framework/av/media/libmedia.

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

Since my target is Nexus 7, I created a new folder device/asus/flo/mylib, where I put 2 files:

  • libmylib.so
  • Android.mk
  • libmylib.so
  • Android.mk

我的第一个尝试是按如下方式在Android.mk中使用PREBUILT_SHARED_LIBRARY:

My first try was to use PREBUILT_SHARED_LIBRARY in Android.mk as follow:

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

Then, I added the dependency in the libmedia module (in framework/av/media/libmedia/Android.mk, I added libmylib to the LOCAL_SHARED_LIBRARIES list).

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

Unfortunately, the build (lunch aosp_flo-eng && make -j4) failed:

*** 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(我不太了解其中的区别):


Therefore, I replaced PREBUILT_SHARED_LIBRARY by BUILD_PREBUILT (I don't really understand the difference):

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无限打印:

But unfortunately, the tablet did not boot. adb logcat printed indefinitely:

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,一切都很好,平板电脑可以正常启动.


If I remove libmylib from framework/av/media/libmedia/Android.mk, everything is fine, the tablet boots correctly.

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

Note that I don't even call the library at this point, the simple fact to declare it as a libmedia dependency is problematic.

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

I tried with several .so (including one that I tested on the tablet with a binary calling a function it exposes, directly in /data/local/tmp, so the .so is ok).

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

I probably missed something. Any clue?

推荐答案

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

I tested the same thing on Nexus 5, which is fortunately more verbose :)

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

The problem was that LOCAL_MODULE and LOCAL_SRC_FILES didn't use the same lib name (a problem that was not present in my original post, since I wanted to abstract the details).

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.

That way, there was a /system/lib/libsomething.so, but a dlopen() failed because /system/lib/libmylib.so was not found.

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

Using the same name for both solves the problem:

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 AOSP中包括预构建的共享库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆