Cómo acceder a la biblioteca libmediaplayerservice propia de libmedia_jni en Android Gingerbread
De forma predeterminada, Ginobread 2.3 utiliza PV_Player (biblioteca opencore). He encontrado una solución sólo debe ser parche sistema build.prop archivo, pero no quiero parche del sistema. Quiero crear mi propia biblioteca usando el trabajo de marco de medios de android que usará el jugador StageFright. Sé que libmediaplayerservice decide la selección del jugador. Echa un vistazo al marco de los medios de comunicación
Quiero crear la biblioteca de acuerdo con el marco de android –
- Comunicarse con el daemon RIL de Android o mensajes de interceptación del demonio androide de RIL
- ¿Cómo acceder a los archivos de Android Lollipop DocumentFile a través de NDK?
- Android código de bits de código nativo - problema de enlace
- Compilando ICU para Android - 'uint64_t' no nombra un tipo
- Error: No se pudo resolver el tipo 'JNIENV'
Pero el problema es que libmedia no interactúa directamente con libmediaplayerservice biblioteca, no es directamente dependiente libmediaplayerservice biblioteca. De modo que no pueda crear el jugador del stagefright. Libmedia se comunica con libmediaplayerservice library a través del mecanismo Binder IPC. ¿Cómo puedo parchar la biblioteca de libmedia fuente, de modo que pueda tener acceso a mi libmediaplayerservice la biblioteca y capaz de crear el jugador de StageFright así como todo el acceso del registrador de StageFright etc en vez de la biblioteca del opencore.
- Compilación de la última versión de OpenSSL para Android
- Android: construye APKs separados para diferentes arquitecturas de procesador
- ¿Es posible reiniciar el teléfono con Android SDK o NDK?
- Obtener error de referencia indefinido en stdout, stderr mientras compila utilizando la cadena de herramientas x86 de Android NDK
- Error NDK-build de NDK
- Cómo usar Crypto ++ con Jni o NDK para una aplicación de Android
- GCC: Prueba de herencia simple falla
- No se pudo cargar la aplicación Android NDK
No creo que puedas modificar cómo funcionan los servicios de medios sin patchear el sistema. Como el servicio de medios y sus bibliotecas están en la partición del sistema, en realidad no tienes ninguna forma de secuestrar la carga jni. Si está ejecutando una ROM none-AOSP (como Samsung, HTC, etc.), no podrá intercambiar las librerías, ya que las de stock rom contienen muchas vinculaciones con las librerías propietarias.
Al mirar el código fuente de Android, el mecanismo de encuadernación que está mencionando debe mirar el método 'getMediaPlayerService ()' y comprobar cómo el gestor de servicios gestiona el servicio de medios. Si puede parche este método y definir correctamente su servicio que debe estar bien.
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; }
El método en cuestión se encuentra en: frameworks/base/media/libmedia/IMediaDeathNotifier.cpp
Además, el servicio se establece llamando a:
void MediaPlayerService::instantiate() { defaultServiceManager()->addService( String16("media.player"), new MediaPlayerService()); }
Que se puede encontrar en: /frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp