在 Android AOSP 中包含预构建的共享库
Include prebuilt shared library in Android AOSP
我想使用一些 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
中,我将 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
如果我从 framework/av/media/libmedia/Android.mk
中删除 libmylib
,一切都很好,平板电脑可以正确启动。
请注意,此时我什至没有调用库,将其声明为 libmedia
依赖项这一简单事实是有问题的。
我尝试了几个 .so
(包括我在平板电脑上测试过的一个二进制调用它公开的函数,直接在 /data/local/tmp
中,所以 .so
没问题) .
我可能漏掉了什么。有什么线索吗?
我在 Nexus 5 上测试了同样的东西,幸运的是它更冗长:)
问题是 LOCAL_MODULE
和 LOCAL_SRC_FILES
没有使用相同的库名称(这个问题在我原来的 post 中不存在,因为我想抽象详情)。
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)
我的问题是我将 LOCAL_SRC_FILES 指向我预建的 .so 文件 在 libs 文件夹中。但是您不能将预构建的 .so 文件包含在 libs 文件夹中,因为它是随每个 ndk-build.
生成的
我想使用一些 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
中,我将 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
如果我从 framework/av/media/libmedia/Android.mk
中删除 libmylib
,一切都很好,平板电脑可以正确启动。
请注意,此时我什至没有调用库,将其声明为 libmedia
依赖项这一简单事实是有问题的。
我尝试了几个 .so
(包括我在平板电脑上测试过的一个二进制调用它公开的函数,直接在 /data/local/tmp
中,所以 .so
没问题) .
我可能漏掉了什么。有什么线索吗?
我在 Nexus 5 上测试了同样的东西,幸运的是它更冗长:)
问题是 LOCAL_MODULE
和 LOCAL_SRC_FILES
没有使用相同的库名称(这个问题在我原来的 post 中不存在,因为我想抽象详情)。
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)
我的问题是我将 LOCAL_SRC_FILES 指向我预建的 .so 文件 在 libs 文件夹中。但是您不能将预构建的 .so 文件包含在 libs 文件夹中,因为它是随每个 ndk-build.
生成的