前言
接上文《》介绍register_android_media_MediaScanner的registerNativeMethods()注册是在android_media_MediaPlayer.cpp中JNI_OnLoad,上次有个疑惑,哪何时加载JNI_OnLoad()?
// This function only registers the native methods, and is called from // JNI_OnLoad in android_media_MediaPlayer.cpp int register_android_media_MediaScanner(JNIEnv *env) { return AndroidRuntime::registerNativeMethods(env, kClassMediaScanner, gMethods, NELEM(gMethods)); }
流水账而已,勿喷!
正文
在android_media_MediaPlayer.cpp的JNI_OnLoad()中
jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) { //略 if (register_android_media_ImageWriter(env) != JNI_OK) { goto bail; } if (register_android_media_ImageReader(env) < 0) { goto bail; } if (register_android_media_MediaPlayer(env) < 0) { goto bail; } if (register_android_media_MediaRecorder(env) < 0) { goto bail; } if (register_android_media_MediaScanner(env) < 0) { goto bail; } if (register_android_media_MediaMetadataRetriever(env) < 0) { goto bail; } if (register_android_media_ResampleInputStream(env) < 0) { goto bail; } if (register_android_media_MediaProfiles(env) < 0) { goto bail; } if (register_android_mtp_MtpDatabase(env) < 0) { goto bail; } if (register_android_mtp_MtpDevice(env) < 0) { goto bail; } if (register_android_mtp_MtpServer(env) < 0) { goto bail; } if (register_android_media_MediaCodec(env) < 0) { goto bail; } if (register_android_media_MediaSync(env) < 0) { goto bail; } if (register_android_media_MediaExtractor(env) < 0) { goto bail; } if (register_android_media_MediaMuxer(env) < 0) { goto bail; } if (register_android_media_MediaCodecList(env) < 0) { goto bail; } if (register_android_media_Crypto(env) < 0) { goto bail; } if (register_android_media_Drm(env) < 0) { goto bail; } if (register_android_media_Descrambler(env) < 0) { goto bail; } if (register_android_media_MediaHTTPConnection(env) < 0) { goto bail; } result = JNI_VERSION_1_4; bail: return result; }
注册了很多,那你是否很好奇过,那啥时候会调用JNI_OnLoad()呢?
其实一开始我是没看懂,后面搜索了一下[media_jni]
base/media/java/android/media/CamcorderProfile.java: System.loadLibrary("media_jni"); base/media/java/android/media/CameraProfile.java: System.loadLibrary("media_jni"); base/media/java/android/media/DecoderCapabilities.java: System.loadLibrary("media_jni"); base/media/java/android/media/EncoderCapabilities.java: System.loadLibrary("media_jni"); base/media/java/android/media/ImageReader.java: System.loadLibrary("media_jni"); base/media/java/android/media/ImageWriter.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaCodec.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaCodecList.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaCrypto.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaDescrambler.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaDrm.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaExtractor.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaHTTPConnection.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaMetadataRetriever.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaMuxer.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaPlayer.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaRecorder.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaScanner.java: Log.v(TAG, "loadLibrary media_jni : "); base/media/java/android/media/MediaScanner.java: System.loadLibrary("media_jni"); base/media/java/android/media/MediaSync.java: System.loadLibrary("media_jni"); base/media/java/android/media/ResampleInputStream.java: System.loadLibrary("media_jni"); base/media/java/android/media/midi/MidiDevice.java: System.loadLibrary("media_jni"); base/media/java/android/mtp/MtpDatabase.java: System.loadLibrary("media_jni"); base/media/java/android/mtp/MtpDevice.java: System.loadLibrary("media_jni"); base/media/java/android/mtp/MtpServer.java: System.loadLibrary("media_jni");
MediaPlayer和MediaScanner等类都加载了[media_jni]库。
按照上面的意思,是不是只要其中一个加载[media_jni]库,都会去调用JNI_OnLoad()?
为了验证,我们可以加个日志打印一下。
我再MediaScanner.java中和android_media_MediaPlayer.cpp的JNI_OnLoad()中加了打印,开机后MediaProvider通知MediaScanner去扫描。下面日志打印:
MediaScanner: loadLibrary media_jni : MediaPlayer-JNI: JNI_OnLoad MediaScannerJNI: native_init
从上面可以看出,执行MediaScanner的静态代码块加载so后马上执行了android_media_MediaPlayer.cpp的JNI_OnLoad()。
参考文章
-
《
历史上的今天
暂无评论...
随机推荐
Android 6.0 Settings源码简单分析之蓝牙(2)
上一篇《Android 6.0 Settings源码简单分析之蓝牙(1)》我们只是简单的介绍了蓝牙的界面和流程的启动,讲得比较粗糙,这次我们继续深入讨论蓝牙,设计Framework的代码源码:Android 6.0应用:Settings 和 Framework(权且看做一个应用吧^_^...
adb shell控制多媒体
前言记录一下通过adb shell 命令进行控制多媒体。这一套都是Android提供的标准,只要多媒体实现了MediaSession.Callback的响应即可。正文mMediaSession = new MediaSession(MusicApp.getContext(), TAG);m...
ProgressBar不显示和不旋转
前言ProgressBar在xml中配置IndeterminateDrawable是可以的,但是如果换肤或者通过Java代码改变IndeterminateDrawable的资源就出现ProgressBar被影藏和不旋转问题。好记性不如烂笔头正文上面有两个问题:ProgressBar被影...
狄兰·托马斯:不要温和地走进那个良夜
不要温和地走进那个良夜,老年应当在日暮时燃烧咆哮;怒斥,怒斥光明的消逝。虽然智慧的人临终时懂得黑暗有理,因为他们的话没有迸发出闪电,他们也并不温和地走进那个良夜。善良的人,当最后一浪过去,高呼他们脆弱的善行可能曾会多么光辉地在绿色的海湾里舞蹈,怒斥,怒斥光明的消逝。狂暴的人抓住并歌唱过...
木心 :至少,每天要看书
不要讲文学是崇高伟大的。文学可爱。大家课后不要放弃文学。文学是人学。至少,每天要看书,开始读书,要浅,浅到刚开始就可以居高临下。一上来听勃拉姆斯第一交响乐,你会淹死。一开始听《圣母颂》、《军队进行曲》,很好。我小时候听这些,后来到杭州听贝多芬的《月光奏鸣曲》,居然完全不懂,对西方,一开始从基督教...
简单记录AIDL添加回调
前言之前也记录过AIDL的使用,今天简单写AIDL添加回调代码。记录一下,方便自己查阅。流水账,勿喷!正文为了简单一点,放在同一个应用中,然后把服务设置到新的进程中。AIDL文件设置回调,这里会创建两个AIDL文件。ICar.aidl// ICar.aidlpackage ...