MediaScanner源码JNI介绍2

Android  NDK  源码分析  2023年7月10日 am8:08发布1年前 (2023)更新 城堡大人
105 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

切换语言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...