我想创建一个使用Android系统/ lib / libmedia.so的播放器。
直接使用JNI播放视频。
在Android.mk中,我添加“-lmedia”以包含库,但我无法直接链接它。
这是我的过程。
编写一个Cpp文件,其中包含libmedia.so中的一些头文件
在LOCAL_LDLIBS的Android.mk中添加“-lmedia”
如..
LOCAL_LDLIBS -lmedia -lstagefright
使用ndk-build构建.so
有没有人有帮助的答案?
答案 0 :(得分:5)
libmedia.so
和libsinstructionght.so
不属于公共API。这意味着理论上,你不应该依赖它们。但实际上,这些库存在于所有设备上,但它们是不同的。
您可以从设备中提取此二进制文件,甚至可以使用命令
从模拟器中提取adb pull /system/lib/libmedia.so C:/android-ndk/platforms/android-14/arch-arm/usr/lib
这会将该文件与公共API一起使用,以便与ndk-build一起使用更容易。另一方面,你应该知道不同级别的Android之间的碎片,还有芯片组,制造商甚至模型。
为了解决这个问题,我将来自不同设备的 .so 文件拉到不同的目录中,并将其中一个添加到链接器路径中,例如
LOCAL_LDLIBS += -Lc:/android/galaxys.4.1.2.system.lib
上述说明无法解决您所采用的方法所面临的重大问题。 libmedia.so
并非旨在与用户应用相关联。它假定特权用户的上下文可以访问受保护的设备,例如摄像头,编解码器和屏幕。
如果您定位到有根设备或准备自定义ROM,则可以充分利用此库。并且知道你在做什么,以及如何避免从系统中窃取必要的资源。
否则链接媒体库的收益很少。
答案 1 :(得分:0)
PREBUILT_SHARED_LIBRARY 指向用于指定预构建共享库的构建脚本。 与BUILD_SHARED_LIBRARY和BUILD_STATIC_LIBRARY不同,值 LOCAL_SRC_FILES必须是预建共享的单一路径 库(例如foo / libfoo.so),而不是源文件。
您可以使用另一个模块引用预构建的库 LOCAL_PREBUILTS变量(有关更多信息,请参阅docs / PREBUILTS.html) 信息)。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
参考NDK文档。
PREBUILT_STATIC_LIBRARY 这与PREBUILT_SHARED_LIBRARY相同,但对于静态库 而是文件。有关更多信息,请参阅docs / PREBUILTS.html。
请阅读NDK文档了解更多详情。