Android音频流程一(JNI部分)
来源:互联网 发布:海岛奇兵民房升级数据 编辑:程序博客网 时间:2024/05/01 11:39
1、Music.apk至java MediaPlayer 至 libmedia MediaPlayer (JNI)
Start是Java空间代码,在框架层的frameworks/base/media/java/android/media/mediaPlayer.java中,
通过JNI和android binder机制,向C++空间调用实现;向上打包成mediaplayer库提过给应用开发使用。
/**描述: * Starts or resumes playback. If playback had previously been paused, * playback will continue from where it was paused. If playback had * been stopped, or never started before, playback will start at the * beginning. * * @throws IllegalStateException if it is called in an invalid state */ public void start() throws IllegalStateException { stayAwake(true); _start(); }
private native void _start() throws IllegalStateException;
_start是本地方法,会通过JNI调用android的实现,实现代码位置在:
frameworks/base/media/jni/android_media_MediaPlayer.cpp
JNINativeMethod gMethods[]数组中定义了JVM和C++函数对应关系,包括函数名称和传递参数对应,
如{"_start", "()V",(void *)android_media_MediaPlayer_start},
其中:
“_start”是java空间函数名称
“()V”是java空间参数和函数类型,括号内为参数,用;分开多个参数,括号后面跟着函数类型,V是void意思,I是int意思等等
“(void *)android_media_MediaPlayer_start”是对应C++空间函数类型和函数名称
static voidandroid_media_MediaPlayer_start(JNIEnv *env, jobject thiz){ LOGV("start"); sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); return; } process_media_player_call( env, thiz, mp->start(), NULL, NULL );}
JNIEnv *env本地空间的资源,jobject thiz是java空间资源;getMediaPlayer(env, thiz)先从java空间资源中获取对应本地资源,返回类型为MediaPlayer指针;process_media_player_call调用MediaPlayer类的方法start。至此,已经完成从java空间的start到本地实现中的start调用关系,后面start怎么实现就是service的事情了。
从Music.apk的方法start、pause/resume、stop,到C++实现start、pause/resume、stop的调用流程是一样的
- Android音频流程一(JNI部分)
- Android音频流程一(JNI部分)
- Android音频流程二(Binder部分)
- Android音频流程二(Binder部分)
- Android NDK 开发(一)JNI简介及调用流程
- android音频(一)
- android音频(一)
- JNI(一) - Android Studio简单开发流程
- JNI和NDK编程(一)JNI的开发流程
- android jni 开发流程
- Android JNI开发流程
- Android Studio JNI 流程
- android jni开发流程
- Android JNI开发流程
- WebRTC 音频处理流程(一)
- WebRTC 音频处理流程(二) 预解复用部分
- Android 初识JNI(一)
- Android 初识JNI(一)
- 最长公共子序列
- trace “hello world”
- 搭建android开发环境
- 13.3线程的生命周期与线程状态
- 线程1_20110905
- Android音频流程一(JNI部分)
- 线程2_20110906
- 第十三章 多线程 第二讲
- HTML5新的数字输入控件
- CDMA短信接收PDU串分析
- 用do while来编写一元二次方程
- C 函数中调用Lua函数时,对于lua_pcall使用的困惑
- Android音频流程二(Binder部分)
- MFC中用户自定义消息的消息响应函数原型