企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
初次接触JNI,感觉最神奇的就是,Java竟然能够调用Native的函数,可它是怎么做到的呢?网上有很多介绍JNI的资料。由于Android大量使用了JNI技术,本节就将通过源码中的一处实例,来学习相关的知识,并了解它是如何调用Native的函数的。 这个例子,是和MediaScanner相关的。在本书的最后一章,会详细分析它的工作原理,这里先看和JNI相关的部分,如图2-2所示: :-: ![](http://img.blog.csdn.net/20150802093807202?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图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。 >[info] **提示**:MediaScanner是Android平台中多媒体系统的重要组成部分,它的功能是扫描媒体文件,得到诸如歌曲时长、歌曲作者等媒体信息,并将它们存入到媒体数据库中,供其他应用程序使用。