注册native函数有两种方法:静态注册和动态注册。
根据函数名找到对应的JNI函数,Java层调用函数时,会从对应的JNI中寻找该函数,如果没有就会报错,如果存在则会建立一个关联联系,以后在调用时会直接使用这个函数,这部分的操作由虚拟机完成。
静态方法就是根据函数名来遍历java和jni函数之间的关联,而且要求jni层函数的名字必须遵循特定的格式,其缺点在于:
JNI 允许你提供一个函数映射表,注册给Jave虚拟机,这样Jvm就可以用函数映射表来调用相应的函数,就可以不必通过函数名来查找需要调用的函数了。
JNI_OnLoad()函数在VM执行System.loadLibrary(xxx)函数时被调用,它有两个重要的作用:
RegisterNatives在AndroidRunTime里定义:
jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,jint nMethods)
clazz:Java类对象
Methods:类中的本地方法
nMethods:类中的本地方法数
本地方法注册相较于函数名映射的好处是不需要使用javah生成一个C++头文件,也不必使用javah自动生成的长长的C++函数名,往往在native函数很多的情况下,扩展比较灵活。同时,Java虚拟机不需要进行映射处理,极大提高运行速度、提升运行效率。