class<--> 一一对应so-->method    
每个so对应于一个类对象
类中的每个native方法对应 于so中的一个native的function,对应关系涉及 {clazz, "name", "Signature", func_addr}
 
      参数jclazz描述的是要注册JNI方法的类,而参数methods描述的是要注册的一组JNI方法,这个组JNI方法的个数由参数nMethods来描述。
        函数RegisterNatives首先是调用函数dvmDecodeIndirectRef来获得要注册JNI方法的类对象,接着再通过一个for循环来依次调用函数dvmRegisterJNIMethod注册参数methods描述所描述的每一个JNI方法。注意,每一个JNI方法都由名称、签名和地址来描述(还包括clazz,即类对象)。
 
 
         函数dvmRegisterJNIMethod在注册参数methodName所描述的JNI方法之前,首先会进行一系列的检查,包括:
        1. 确保参数clazz所描述的类有一个名称为methodName的成员函数。首先是调用函数dvmFindDirectMethodByDescriptor来检查methodName是否是clazz的一个非虚成员函数,然后再调用函数dvmFindVirtualMethodByDescriptor来检查methodName是否是clazz的一个虚成员函数。
        2. 确保类clazz的成员函数methodName确实是声明为JNI方法,即带有native修饰符,这是通过调用函数dvmIsNativeMethod来实现的。

 

当一个Method对象method描述的是一个JNI方法的时候,它的成员变量nativeFunc保存的就是该JNI方法的地址,但是在对应的JNI方法注册进来之前,该成员变量的值被统一设置为dvmResolveNativeMethod。因此,当我们调用了一个未注册的JNI方法时,实际上执行的是函数dvmResolveNativeMethod。函数dvmResolveNativeMethod此时会在Dalvik虚拟内部以及当前所有已经加载的共享库中检查是否存在对应的JNI方法。如果不存在,那么它就会抛出一个类型为java.lang.UnsatisfiedLinkError的异常。

最新文章

  1. python成长之路【第十二篇】:RabbitMQ入门
  2. 关于JavaScript的判断语句(1)
  3. firefox 安装flash插件
  4. Android中JNI编程的那些事儿(1)
  5. HDOJ 3047 带权并查集
  6. IE通过推理IE陈述的版本号
  7. 中兴电信光纤猫F450获取管理员密码方法
  8. java返回json数据日期为一串数字字符串 js 转义
  9. day9
  10. DesignModeler&amp;nbsp;GestureRecgin…
  11. Java 使用Arrays.sort排序 从大到小排列
  12. 20165234 《Java程序设计》第六周学习总结
  13. 关于java poi itext生成pdf文件的例子以及方法
  14. KiCad 开源元件库收集
  15. 谈谈Java引用和Threadlocal的那些事
  16. 23种设计模式之观察者模式(Observer)
  17. 【bzoj1194】 HNOI2006—潘多拉的盒子
  18. talib 中文文档(三):talib 方法大全
  19. asp:Repeater数据源为空时处理方式
  20. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

热门文章

  1. CSS 清除浮动的4种方法
  2. python列表里的字典元素去重
  3. EOJ-大学生程序设计邀请赛(华东师范大学)-E-黑心啤酒厂
  4. Ubuntu系统用户与用户组
  5. [ CodeVS冲杯之路 ] P1044
  6. Python数据结构——栈
  7. ui_modules和ui_method
  8. MFC/C++/C中字符类型CString, int, string, char*之间的转换
  9. 使用log4j2分离系统日志与业务日志
  10. 在windows系统上word转pdf