5

我想创建一个使用 Android system/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 回答 2

6

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不打算链接到用户应用程序。它假定具有访问受保护设备(如相机、编解码器和屏幕)的特权用户的上下文。

如果您以 root 设备为目标或准备自定义 ROM,则可以充分利用此库。并且知道你在做什么,以及如何避免从系统中窃取重要资源。

否则,链接媒体库几乎没有什么收获。

于 2012-10-29T06:39:56.523 回答
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 文档了解更多详细信息。

于 2012-10-29T06:16:13.693 回答