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

如何在Android Gingerbread中从libmedia_jni访问自己的libmediaplayerservice库,android,android-ndk,android-mediaplayer,stagefright,Android,Android Ndk,Android Mediaplayer,Stagefright,默认情况下,android GigerRead 2.3使用PV_播放器(opencore库)。我找到了一个解决方案,它应该是修补system build.prop文件,但我不想修补系统。我想创建我自己的图书馆使用android媒体框架将使用StageFright播放器。我知道libmediaplayerservice决定了玩家的选择。看一看这本书 我想根据android框架创建库- libmedia_jni_own 利布媒体公司 libmediaplayerservice_own 但问题是l

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

我想根据android框架创建库-

  • libmedia_jni_own
  • 利布媒体公司
  • libmediaplayerservice_own

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

    我认为您无法通过修补系统来修改媒体服务的工作方式。由于媒体服务及其库位于系统分区上,您实际上没有任何方法劫持jni负载。如果您运行的是非AOSP rom(如库存三星、HTC等),您将无法仅交换LIB,因为库存rom中的LIB包含大量与专有LIB的链接。

    通过查看您提到的android源代码绑定机制,您应该查看方法“getMediaPlayerService()'并检查service manager如何处理媒体服务。如果您可以修补此方法并正确定义您的服务,您应该可以

    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/libmediaplayerservice/MediaPlayerService.cpp

    我已经修补了此代码,并尝试从libmedia访问它。但它造成了崩溃。我试图访问StagefrightPlayer libmedia_jni,但它在setsurfaceview中导致崩溃。你应该在帖子中提到这一点。我正在使用cygwin在windows上构建应用程序。你能告诉我,如果我在Linux平台上构建应用程序,库将提供相同的性能吗。因为在windows上构建so库的大小与在linux平台上构建so库的大小不同。构建和相应的编译代码取决于不同的编译器。如何优化代码取决于编译器。因此,性能可能会有所不同,但可能是相同的。
     void MediaPlayerService::instantiate() {
                 defaultServiceManager()->addService(
                 String16("media.player"), new MediaPlayerService());
     }