1JNI技术可以做什么?
(1)Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
(2)Native程序中的函数可以调用Java层的函数,也就是在C/C++程序中可以调用Java的函数。
如图所示:

2JNI技术出现的原因是什么?
(1)承载Java世界的虚拟机是用Native语言写的,而虚拟机又运行在具体平台上,所以虚拟机本身无法做到平台无关。然而,有了JNI技术,就可以对Java层屏蔽具体的虚拟机实现上的差异了。这样,就能实现Java本身的平台无关特性。其实Java一直在使用JNI技术,只是我们平时较少用到罢了。
(2)早在Java语言诞生前,很多程序都是用Native语言写的,它们遍布在软件世界的各个角落。Java出世后,它受到了追捧,并迅速得到发展,但仍无法对软件世界彻底改朝换代,于是才有了折中的办法。既然已经有Native模块实现了相关功能,那么在Java中通过JNI技术直接使用它们就行了,免得落下重复制造轮子的坏名声。另外,在一些要求效率和速度的场合还是需要Native语言参与的。
3Java是如何调用Native函数的?

说明:
(1)Java层对应的是MediaScanner.java,而这个MediaScanner类有一些函数是需要由Native层实现的。
(2)JNI层对应的是libmedia_jni.so。media_jni是JNI库的名字,其中,下划线前的“media”是Native层库的名字,这里就是libmedia库。下划线后的”jni“表示它是一个JNI库。注意,JNI库的名字可以随便取,不过Android平台基本上都采用“lib模块名_jni.so”的命名方式。
(3)Native层对应的是libmedia.so,这个库完成了实际的功能。
MediaScanner.java将通过JNI库libmedia_jni.so和Native的libmedia.so交互。
JNI层必须实现为动态库的形式,这样Java虚拟机才能加载它并调用它的函数。
4JNI调用的步骤是什么?
(1)加载对应的JNI库
(2)声明由关键字native修饰的函数
5如何注册JNI函数?
(1)静态方法:根据函数名来找对应的JNI函数
a.先编写Java代码,然后编译生成.class文件。
b.使用Java的工具程序javah,如javah–o output packagename.classname ,这样它会生成一个叫output.h的JNI层头文件。其中packagename.classname是Java代码编译后的class文件,而在生成的output.h文件里,声明了对应的JNI层函数,只要实现里面的函数即可。
(2)动态注册:Java native函数数和JNI函数是一一对应的。在JNI技术中,用来记录这种一一对应关系的,是一个叫JNINativeMethod的结构
6动态注册的函数在什么时候、什么地方被谁调用?
(1)当Java层通过System.loadLibrary加载完JNI动态库后,紧接着会查找该库中一个叫JNI_OnLoad的函数,如果有,就调用它,而动态注册的工作就是在这里完成的
(2)