MediaScanner源码JNI介绍2

Android  NDK  源码分析  2023年7月10日 am8:08发布1年前 (2023)更新 91es.com站长
69 0 0

前言

接上文《MediaScanner源码JNI介绍》介绍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()。

参考文章

  1. MediaScanner源码JNI介绍

 历史上的今天

  1. 2024: Android解析lrc文件代码片段(0条评论)
  2. 2024: FileProvider分享的Uri转成文件(0条评论)
  3. 2021: 许立志:梦想(0条评论)
  4. 2020: [摘]Java垃圾回收机制(GC)详解(0条评论)
  5. 2019: 戴望舒 :寻梦者(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

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 ...