2024年3月28日发(作者:)
MediaPlayer创建
接着我们进入应用层,看看MediaPlayer创建时做了那些事情。
MediaPlayer构造
应用层MediaPlayermediaPlayer = new MediaPlayer()。
在这个机关函数中,较为首要的就是native_setup(). 这个函数在
之前的声明中包含native,申明这是一个native函数。也就是说
native_setup()函数其实native层实现的。接下来我们要做的就是
按照JNI找到这个函数是如何实现的。native函数实现地点的文件的
文件名都是如下定名的,把包名中的"."调换为"_"+类名。所以我们
要找文件就是android_media_.在这个文件中我
们有个首要的数组
1 publicMediaPlayer(){
2
3
//这里会构建一个EventHandler的Handler对象,用于处理一些消息回调
4 Looperlooper;
5 if ((looper = er()) != null) {
6 mEventHandler = newEventHandler(this, looper);
7 } elseif ((looper = nLooper()) != null) {
8 mEventHandler = newEventHandler(this, looper);
9 } else {
10 mEventHandler = null;
11 }
12 ......
13
14 /* Native setup requires a weak reference to our object.
15 * It's easier to create it here than in C++.
16 */
17
18
//这个才是重点,jni层创建MediaPlayer,将java层弱引用传递给jni层。
native_setup(newWeakReference
}
构造之前MediaPlayer类有一段静态代码块,加载了media_
库,用于初始jni相关,早于构造方法,在加载类时就执行。一般是全
局性的数据,变量,可以放在这。
。
1 static {
2 brary("media_jni");
3 native_init();
4 }
5 privatestaticnativefinalvoidnative_init();
这里会先加载libmedia_jni的so库,需要在这里做个标记,下一节
会介绍。
调用本地方法native_init,我们找到它的jni实现,位于
frameworks/base/media/jni/android_media_中:
1
2 // This function gets some field IDs, which in turn causes cl
3 // It is called from a static block in MediaPlayer, which won
4 // first time an instance of this class is used.
5 staticvoidandroid_media_MediaPlayer_native_init(JNIEnv *env)


发布评论