如何在Android Gingerbread中从libmedia_jni访问自己的libmediaplayerservice库
默认情况下,android GigerRead 2.3使用PV_播放器(opencore库)。我找到了一个解决方案,它应该是修补system build.prop文件,但我不想修补系统。我想创建我自己的图书馆使用android媒体框架将使用StageFright播放器。我知道libmediaplayerservice决定了玩家的选择。看一看这本书 我想根据android框架创建库-如何在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
如何修补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());
}