如何使用android.mk链接到Android NDK应用程序中的libmedia.so系统库?

时间:2012-10-29 04:22:53

标签: android android-ndk

我想创建一个使用Android系统/ lib / libmedia.so的播放器。

直接使用JNI播放视频。

在Android.mk中,我添加“-lmedia”以包含库,但我无法直接链接它。

这是我的过程。

  1. 编写一个Cpp文件,其中包含libmedia.so中的一些头文件

  2. 在LOCAL_LDLIBS的Android.mk中添加“-lmedia”

    如..

    LOCAL_LDLIBS -lmedia -lstagefright

  3. 使用ndk-build构建.so

  4. 发生错误!!

    有没有人有帮助的答案?

2 个答案:

答案 0 :(得分:5)

libmedia.solibsinstructionght.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文档了解更多详情。