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(this));

}

构造之前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)