2.2 学习JNI的实例:MediaScanner
初次接触JNI,感觉最神奇的就是Java竟然能够调用Native的函数,可它是怎么做到的呢?由于Android大量使用了JNI技术,本章接下来的内容就将通过源码中的一处实例来讲解JNI相关的知识。
其中这个例子是和MediaScanner相关的,本书的最后一章会详细分析它的工作原理,这里先看与JNI相关的部分,如图2-2所示:
图 2-2 MediaScanner和它的JNI
将图2-2与图2-1结合来看,可以知道:
Java世界对应的是MediaScanner,而这个MediaScanner类有一些函数需要由Native层来实现。
JNI层对应的是libmedia_jni.so。media_jni是JNI库的名字,其中,下划线前的“media”是Native层库的名字,这里就是libmedia库。下划线后的“jni”表示它是一个JNI库。注意,JNI库的名字可以随便取,不过Android平台基本上都采用“lib模块名_jni.so”的命名方式。
Native层对应的是libmedia.so,这个库完成了实际的功能。
MediaScanner将通过JNI库libmedia_jni.so和Native层的libmedia.so交互。
从上面的分析中还可知道:JNI层必须实现为动态库的形式,这样Java虚拟机才能加载它并调用它的函数。
下面来看MediaScanner。
提示 MediaScanner是Android平台中多媒体系统的重要组成部分,它的功能是扫描媒体文件,得到诸如歌曲时长、歌曲作者等媒体信息,并将它们存入到媒体数据库中,供其他应用程序使用。