前言
接上文《》介绍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()。
参考文章
-
《
历史上的今天
暂无评论...
随机推荐
切换语言Fragment被回收
这个最近在项目中遇到,摘抄于此。开发过程中,页面使用fragmentactivity,可能会遇到这样的问题应用放置于后台,前台应用使用资源过多,手机默认会回收一些优先级低应用的资源。这样当我们的应用回到前端的时候,可能会因为资源被回收,引起异常,导致fragment显示错乱。 查了差相关资料以及别...
梁小斌:中国,我的钥匙丢了
中国,我的钥匙丢了。 那是十多年前,我沿着红色大街疯狂地奔跑,我跑到了郊外的荒野上欢叫,后来,我的钥匙丢了。 心灵,苦难的心灵,不愿再流浪了,我想回家打开抽屉、翻一翻我儿童时代的画片,还看一看那夹在书页里的翠绿的三叶草。 而且,我还想打开...
周国平:爱的距离
好的爱情有韧性,拉得开,但又扯不断。相爱者互不束缚对方,是他们对爱情有信心的表现。谁也不限制谁,到头来仍然是谁也离不开谁,这才是真爱。好的两性关系有弹性,彼此既非僵硬地占有,也非软弱地依附。相爱的人给予对方的最好礼物是自由。两个自由人之间的爱,拥有必要的张力。这种爱牢固,但不板结;缠绵,但不黏滞...
Android反编译之vdex转dex查看源码
前言最近获取到客户Apk(客户版本Android 9)后使用工具没法看到源代码,system/priv-app/Media目录结构如下:C:.└─oat └─arm64 ├─Media.odex └─Media.vdex└─Media.apk...
沈从文 :生命
我好像为什么事情很悲哀,我想起“生命”。有什么人能用绿竹作弓矢,射入云空,永不落下?我之想象,犹如长箭,向云空射去,去即不返。长箭所注,在碧蓝而明静之广大虚空。明智者若善用其明智,即可从此云空中,读示一小文,文中有微叹与沉默,色与香,爱和怨。无著者姓名。无年月。无故事。无……然而内容极柔美。虚空...
MediaPlayer JNI层介绍
前言之前的《MediaPlayer java层介绍》只是介绍了java中的常用方法,对于JNI层的调用没有进一步介绍,今天就介绍一下JNI层。个人流水账哈,推荐看其他人的,我这只是自己的跟踪记录涉及的代码:frameworks\base\media\java\android\media\M...