Java Android';MediaPlayer是否通过检查本机代码来工作?
检查Java Android';MediaPlayer是否通过检查本机代码来工作?,java,android,android-ndk,java-native-interface,android-mediaplayer,Java,Android,Android Ndk,Java Native Interface,Android Mediaplayer,检查MediaPlayer()的源代码时,start()方法如下所示: public void start() throws IllegalStateException { stayAwake(true); _start(); } private native void _start() throws IllegalStateException; 和\u start()方法如下所示: public void start() throws IllegalSt
MediaPlayer
()的源代码时,start()
方法如下所示:
public void start() throws IllegalStateException {
stayAwake(true);
_start();
}
private native void _start() throws IllegalStateException;
和\u start()
方法如下所示:
public void start() throws IllegalStateException {
stayAwake(true);
_start();
}
private native void _start() throws IllegalStateException;
检查本机\u start()
方法()(称为start()
,但由于本机调用名为\u start()
,因此不应称为\u start()
?):
数据在哪里读取?我想检查Android如何与RTSP一起工作,但我无法找到它在哪里加载数据。我想知道它是否使用了FFMpeg之类的库或其他实现
编辑:
为什么必须使用JNI来执行此代码?\u此mediaplayer文件的JNI中定义了启动方法
从这里调用libmedia启动方法。\u启动方法在这个mediaplayer文件的jni中定义
从这里开始调用libmedia启动方法。您错过了一步。Java代码中的
private native void\u start()
指的是MediaPlayer JNI层(它指的是)
至于RTSP实现,您可能会在其中找到它。您错过了一步。Java代码中的
private native void\u start()
指的是MediaPlayer JNI层(它指的是)
至于RTSP实现,您可能会在以下路径中找到它。以下所有路径都引用src/frameworks/base/ 在media/jni/android\u media\u MediaPlayer.cpp中,您将找到将Java方法调用转发到底层本机框架的jni代码。您可以在文件底部附近的
gMethods[]
数组和AndroidRuntime::registerNativeMethods
调用中看到名称映射。您可以阅读更多关于向JNI注册本机方法的内容,但这并不是真正有趣的部分
在这个阶段,我们处于JavaMediaPlayer
的本地对应物中。在大多数情况下,它也没有做任何有趣的事情。它通过IBinder
事务绑定到MediaPlayerService
。MediaPlayerService
根据媒体类型创建实际的本机播放器,并维护一个客户端(MediaPlayerService::client
),以方便与本机MediaPlayer
)的通信,而本机MediaPlayer
,这反过来又会将内容备份到Java。您可以在以下文件中看到所有这些情况(如果您感兴趣):
media/libmedia/mediaplayer.cpp,
媒体/libmedia/imediplayer.cpp,
media/libmedia/imediplayerclient.cpp,
媒体/libmedia/imediplayerservice.cpp,
媒体/libmediaplayerservice/MediaPlayerService.cpp
libmedia的头文件位于include/media/libmedia/中
现在来看看真正有趣的部分,它们是组件参与者。在MediaServicePlayer.cpp中,有两个
getPlayerType
方法决定实例化哪个播放器。有Stagefright框架(AwesomePlayer和NuPlayer)和用于MIDI的Sonivox播放器。对于RTSP,NuPlayer是您将得到的。您可以在media/libmediaplayerservice/nuplayer/中找到粘合层,在media/libstagefright/和media/libstagefright/rtsp/中找到所有真正的源代码,以下所有路径都引用src/frameworks/base/
在media/jni/android\u media\u MediaPlayer.cpp中,您将找到将Java方法调用转发到底层本机框架的jni代码。您可以在文件底部附近的gMethods[]
数组和AndroidRuntime::registerNativeMethods
调用中看到名称映射。您可以阅读更多关于向JNI注册本机方法的内容,但这并不是真正有趣的部分
在这个阶段,我们处于JavaMediaPlayer
的本地对应物中。在大多数情况下,它也没有做任何有趣的事情。它通过IBinder
事务绑定到MediaPlayerService
。MediaPlayerService
根据媒体类型创建实际的本机播放器,并维护一个客户端(MediaPlayerService::client
),以方便与本机MediaPlayer
)的通信,而本机MediaPlayer
,这反过来又会将内容备份到Java。您可以在以下文件中看到所有这些情况(如果您感兴趣):
media/libmedia/mediaplayer.cpp,
媒体/libmedia/imediplayer.cpp,
media/libmedia/imediplayerclient.cpp,
媒体/libmedia/imediplayerservice.cpp,
媒体/libmediaplayerservice/MediaPlayerService.cpp
libmedia的头文件位于include/media/libmedia/中
现在来看看真正有趣的部分,它们是组件参与者。在MediaServicePlayer.cpp中,有两个
getPlayerType
方法决定实例化哪个播放器。有Stagefright框架(AwesomePlayer和NuPlayer)和用于MIDI的Sonivox播放器。对于RTSP,NuPlayer是您将得到的。你可以在media/libmediaplayerservice/nuplayer/和media/libstagefright/和media/libstagefright/rtsp/中找到一个粘合层。我选择这个作为答案是因为它写得最详细、最透彻。我选择这个作为答案是因为它写得最详细、最透彻。