rom*_*m1v 4 android android-source
我想使用libmylib.so一些AOSP代码中的预构建共享库(我们称之为),例如在folder中framework/av/media/libmedia。
由于我的目标是Nexus 7,因此我创建了一个新文件夹device/asus/flo/mylib,其中放置了2个文件:
libmylib.soAndroid.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)
Run Code Online (Sandbox Code Playgroud)
然后,我在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.
Run Code Online (Sandbox Code Playgroud)
因此,我替换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)
Run Code Online (Sandbox Code Playgroud)
这样,构建成功。
因此,我闪烁了图像:
fastboot flashall -w
Run Code Online (Sandbox Code Playgroud)
但不幸的是,平板电脑无法启动。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
Run Code Online (Sandbox Code Playgroud)
如果我libmylib从中删除framework/av/media/libmedia/Android.mk,一切都很好,平板电脑可以正常启动。
注意,我现在甚至没有调用该库,将其声明为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)
Run Code Online (Sandbox Code Playgroud)
该模块是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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2967 次 |
| 最近记录: |