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注册本机方法的内容,但这并不是真正有趣的部分

在这个阶段,我们处于Java
MediaPlayer
的本地对应物中。在大多数情况下,它也没有做任何有趣的事情。它通过
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注册本机方法的内容,但这并不是真正有趣的部分

在这个阶段,我们处于Java
MediaPlayer
的本地对应物中。在大多数情况下,它也没有做任何有趣的事情。它通过
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/中找到一个粘合层。我选择这个作为答案是因为它写得最详细、最透彻。我选择这个作为答案是因为它写得最详细、最透彻。