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