解决方案 »

  1.   

    你看下android源码中libmedia的调用流程
      

  2.   

    你看下android源码中libmedia的调用流程看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。
    音频播放流程就是 setDatasource()\prepare()\start().......
    但直接通过so库调用就是有问题
    求指点
      

  3.   

    你看下android源码中libmedia的调用流程看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。
    音频播放流程就是 setDatasource()\prepare()\start().......
    但直接通过so库调用就是有问题
    求指点java层播放媒体的代码也有setDatasource. prepare.其对应 的流程你也看过了吧....
    是不是权限或其它的问题?看下prepare函数,什么情况下会阻塞 啊
      

  4.   

    你看下android源码中libmedia的调用流程看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。
    音频播放流程就是 setDatasource()\prepare()\start().......
    但直接通过so库调用就是有问题
    求指点java层播放媒体的代码也有setDatasource. prepare.其对应 的流程你也看过了吧....
    是不是权限或其它的问题?看下prepare函数,什么情况下会阻塞 啊开log跟了下流程,libmedia.so 是通过binder和libmediaplayer.so进行通信的, libmediaplayer.so在系统中是以/system/bin/mediaserver这个service来提供服务的,libmediaplayer.so接到libmedia.so(也就是我的测试程序进程)的执行prepare()的请求后,确实执行了prepare(),而且通过log对比发现执行结果也是正确的,而阻塞的真正原因在于libmediaplayer.so执行完prepare()后通过binder将结果回传给测试程序时失败,导致测试程序一直阻塞,现在的问题是搞不清为什么回调会失败,以前从没搞过android, 对音频架构中的IBinder机制完全不明白,难道又要去搞清楚IBinder机制,要疯了, 还有一种方法就是直接调用libmediaplayer.so,避过libmedia.so和libmediaplayer.so的Binder通讯,问题是我编译了一下,一大堆的编译问题,悲剧啊
      

  5.   

    你看下android源码中libmedia的调用流程看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。
    音频播放流程就是 setDatasource()\prepare()\start().......
    但直接通过so库调用就是有问题
    求指点java层播放媒体的代码也有setDatasource. prepare.其对应 的流程你也看过了吧....
    是不是权限或其它的问题?看下prepare函数,什么情况下会阻塞 啊开log跟了下流程,libmedia.so 是通过binder和libmediaplayer.so进行通信的, libmediaplayer.so在系统中是以/system/bin/mediaserver这个service来提供服务的,libmediaplayer.so接到libmedia.so(也就是我的测试程序进程)的执行prepare()的请求后,确实执行了prepare(),而且通过log对比发现执行结果也是正确的,而阻塞的真正原因在于libmediaplayer.so执行完prepare()后通过binder将结果回传给测试程序时失败,导致测试程序一直阻塞,现在的问题是搞不清为什么回调会失败,以前从没搞过android, 对音频架构中的IBinder机制完全不明白,难道又要去搞清楚IBinder机制,要疯了, 还有一种方法就是直接调用libmediaplayer.so,避过libmedia.so和libmediaplayer.so的Binder通讯,问题是我编译了一下,一大堆的编译问题,悲剧啊
    那你参考android_media_MediaPlayer.cpp吧,应该可以,里面有IPC的调用,你参考下
      

  6.   

    你看下android源码中libmedia的调用流程看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。
    音频播放流程就是 setDatasource()\prepare()\start().......
    但直接通过so库调用就是有问题
    求指点java层播放媒体的代码也有setDatasource. prepare.其对应 的流程你也看过了吧....
    是不是权限或其它的问题?看下prepare函数,什么情况下会阻塞 啊开log跟了下流程,libmedia.so 是通过binder和libmediaplayer.so进行通信的, libmediaplayer.so在系统中是以/system/bin/mediaserver这个service来提供服务的,libmediaplayer.so接到libmedia.so(也就是我的测试程序进程)的执行prepare()的请求后,确实执行了prepare(),而且通过log对比发现执行结果也是正确的,而阻塞的真正原因在于libmediaplayer.so执行完prepare()后通过binder将结果回传给测试程序时失败,导致测试程序一直阻塞,现在的问题是搞不清为什么回调会失败,以前从没搞过android, 对音频架构中的IBinder机制完全不明白,难道又要去搞清楚IBinder机制,要疯了, 还有一种方法就是直接调用libmediaplayer.so,避过libmedia.so和libmediaplayer.so的Binder通讯,问题是我编译了一下,一大堆的编译问题,悲剧啊
    那你参考android_media_MediaPlayer.cpp吧,应该可以,里面有IPC的调用,你参考下这个文件看过,是JNI这一层的,它向下调用了libmedia.so, 在libmedia.so里面才通过binder和liblibmediaplayerservice.so 进行通信,我看了下通信的代码,感觉比较复杂,要弄清楚估计要花很长时间,我这边又比较急,郁闷
      

  7.   

    直接调用libmediaplayer.so的接口不行,这个库是以service的形式对外提供服务的,它的构造函数是private的,所以没办法直接调用。又回到了原来的问题上,调用libmedia.so与libmediaplayer.so进行通信,libmedia.so远程调用libmediaplayer.so没有问题,libmediaplayer.so也正确执行了,但是在libmediaplayer.so远程调用libmedia.so的notify接口时却出现问题, 求大神给点思路
      

  8.   

    这问题很难吗?就没一个人做过这方面的东西?真心希望了解的人给点建议,你的一句话可能就使我豁然开朗,为什么向大家请教个问题,这么少人回答,搞不懂是CSDN越来越不行了,还是人们越来越冷漠了
      

  9.   

    问题已经解决,原因在于调用完prepare()后主线程被阻塞,没有线程去读去libmediaplayerservice.so传过来的回调消息,在开始的地方加上ProcessState::self()->startThreadpool()就可以了,还是对binder理解不够深刻啊,借这次机会深入研究下binder.
      

  10.   

    using namespace android;  android报红??
      

  11.   

    请问楼主的cpp 是什么平台编译的?能详细说明下吗,我也想做直接调用libmedia.so库的Java程序,使用jni技术。