Android音频流程一(JNI部分)

本文详细解析了Android系统中MediaPlayer从Java层的start方法调用到JNI再到C++空间的实现过程,介绍了如何通过JNI桥接Java与C++代码,以及MediaPlayer在不同层间的交互方式。

1Music.apkjava MediaPlayer 至 libmedia MediaPlayer (JNI

StartJava空间代码,在框架层的frameworks/base/media/java/android/media/mediaPlayer.java中,

通过JNIandroid binder机制,向C++空间调用实现;向上打包成mediaplayer库提过给应用开发使用。

[csharp] view plain copy
  1. /**描述: 
  2.  * Starts or resumes playback. If playback had previously been paused, 
  3.  * playback will continue from where it was paused. If playback had 
  4.  * been stopped, or never started before, playback will start at the 
  5.  * beginning. 
  6.  * 
  7.  * @throws IllegalStateException if it is called in an invalid state 
  8.  */  
  9. public  void start() throws IllegalStateException {  
  10.     stayAwake(true);  
  11.     _start();  
  12. }  

private native void _start() throws IllegalStateException;

_start是本地方法,会通过JNI调用android的实现,实现代码位置在:

frameworks/base/media/jni/android_media_MediaPlayer.cpp

JNINativeMethod gMethods[]数组中定义了JVMC++函数对应关系,包括函数名称和传递参数对应,

{"_start", "()V",(void *)android_media_MediaPlayer_start},

其中:

_start”是java空间函数名称

()V”是java空间参数和函数类型,括号内为参数,用;分开多个参数,括号后面跟着函数类型,Vvoid意思,Iint意思等等

(void *)android_media_MediaPlayer_start”是对应C++空间函数类型和函数名称

[csharp] view plain copy
  1. static void  
  2. android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)  
  3. {  
  4.     LOGV("start");  
  5.     sp<MediaPlayer> mp = getMediaPlayer(env, thiz);  
  6.     if (mp == NULL ) {  
  7.         jniThrowException(env, "java/lang/IllegalStateException", NULL);  
  8.         return;  
  9.     }  
  10.     process_media_player_call( env, thiz, mp->start(), NULL, NULL );  
  11. }  

JNIEnv *env本地空间的资源,jobject thiz是java空间资源;getMediaPlayer(env, thiz)先从java空间资源中获取对应本地资源,返回类型为MediaPlayer指针;process_media_player_call调用MediaPlayer类的方法start。至此,已经完成从java空间的start到本地实现中的start调用关系,后面start怎么实现就是service的事情了。


Music.apk的方法startpause/resumestop,到C++实现startpause/resumestop的调用流程是一样的


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值