例如:android sdk 29中,android.media.MediaPlayer.java
第1283行:
private native void _prepare() throws IOException, IllegalStateException;
怎么查看这个 _prepare()方法的实现?
- 找到Android 8.0.0 android_media_MediaPlayer.cpp源码,第1376行,看到以下代码:
static JNINativeMethod gMethods[] = {
{
"nativeSetDataSource",
"(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;"
"[Ljava/lang/String;)V",
(void *)android_media_MediaPlayer_setDataSourceAndHeaders
},
{"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD},
{"_setDataSource", "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback },
{"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface},
{"_prepare", "()V", (void *)android_media_MediaPlayer_prepare},
{"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync},
{"_start", "()V", (void *)android_media_MediaPlayer_start},
//太长,略掉一部分......
};
挑出_prepare
那一行:
{"_prepare", "()V", (void *)android_media_MediaPlayer_prepare}
这三个参数的解释:
左侧:Java中方法的名字。就是MediaPlayer.java的“_prepare”方法。
中间:用字符串是描述了Java中方法的参数和返回值。()表示没有传递参数,V表示返回值为void。
右侧:函数指针,指向native函数。前面都要加(void *)
可以推断,_prepare
对应的C++函数实现是android_media_MediaPlayer_prepare
,那么有没有这个函数了?还真有,第431行:
先写到这里,以后慢慢读懂,这个C++函数的具体实现。