在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_MODULE
和LOCAL_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)