如何从Android Gingerbread中的libmedia_jni访问自己的libmediaplayerservice库

时间:2012-05-13 07:48:14

标签: android android-ndk android-mediaplayer stagefright

默认情况下,android Gigerbread 2.3使用PV_Player(opencore库)。我找到了一个解决方案,它应该是修补系统build.prop文件,但我不想修补系统。我想使用Android媒体框架工作创建我自己的库,它将使用StageFright播放器。我知道libmediaplayerservice决定了玩家的选择。看看media framework

我想根据android框架创建库 -

  • libmedia_jni_own
  • libmedia_own
  • libmediaplayerservice_own

    但问题是libmedia不直接与libmediaplayerservice库交互,它不直接依赖于libmediaplayerservice库。因此它无法创建stagefright播放器。 Libmedia通过Binder IPC机制与libmediaplayerservice库进行通信。 我如何修补libmedia源库,以便它可以访问我的libmediaplayerservice库,并能够创建StageFright播放器以及StageFright记录器等的所有访问,而不是opencore库。

  • 2 个答案:

    答案 0 :(得分:1)

    我认为您无法修改媒体服务如何处理以及修补系统。由于媒体服务及其库位于系统分区上,因此您无法真正劫持jni负载。如果您运行的是非AOSP rom(如股票三星,HTC等),您将无法换掉库,因为库存ROM包含许多与专有库的链接。

    答案 1 :(得分:1)

    通过查看Android源代码,您提到的Binder机制应该查看方法'getMediaPlayerService()'并检查服务管理器如何处理媒体服务。如果您可以修补此方法并正确定义您的服务,那么您应该没问题。

    IMediaDeathNotifier::getMediaPlayerService()
    {
        LOGV("getMediaPlayerService");
        Mutex::Autolock _l(sServiceLock);
        if (sMediaPlayerService.get() == 0) {
            sp<IServiceManager> sm = defaultServiceManager();
            sp<IBinder> binder;
            do {
                binder = sm->getService(String16("media.player"));
                if (binder != 0) {
                    break;
                 }
                 LOGW("Media player service not published, waiting...");
                 usleep(500000); // 0.5 s
            } while(true);
    
            if (sDeathNotifier == NULL) {
            sDeathNotifier = new DeathNotifier();
        }
        binder->linkToDeath(sDeathNotifier);
        sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
        }
        LOGE_IF(sMediaPlayerService == 0, "no media player service!?");
        return sMediaPlayerService;
    }
    

    有问题的方法位于: frameworks/base/media/libmedia/IMediaDeathNotifier.cpp

    此外,通过调用

    设置服务
     void MediaPlayerService::instantiate() {
                 defaultServiceManager()->addService(
                 String16("media.player"), new MediaPlayerService());
     }
    

    可在以下网址找到:/frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp