native method与so中function的关联
在Android中,可以通过JNI的方式来调用和访问用C/C++实现的代码,这些代码以SharedLibrary的方式存在于so中。从Java Code到Native Code的一般使用过程为:
- 在Java中的某个类中调用
System.loadLibrary(XXX)(对于ing的so的全名应为:libXXX.so),或者System.load(soPathName)(soPathName对应于要加载的某个so的完整路径及文件名)来加载so; - 声明所要调用的静态方法,即需要和so中函数关联的方法名:需要关键字
native。 - 编写so,实现声明的native method的功能。
- 与nativeMethod进行关联:1)使用符合JNI规范的JNI Name String来作为so中的对应函数的函数名:一般为class_name_method_name的形式;2)在JNI_OnLoad中调用jniRegisterNativeMethods手动注册,一半对于每个method需要提供信息:methodName, method signature, function(pointer).
本文则是总结native Method与so中的function如何建立关联关系的:jin native method的注册。对于完整注册过程可参考老罗的博文Dalvik虚拟机JNI方法的注册过程分析,其中已有详尽的介绍。
通过jniRegisterNativeMethods的注册
这个方式的注册,是用户在JNI_OnLoad中主动注册完成的。重新学习注册过程,了解了method的管理方法和调用方式。 注册过程就是一个将native function绑定到一个native method,准确点说应该是将该native method结构中的DalvikBidgeFunc nativeFunc赋值为某一个jniBridge函数,然后将ins赋值为native function的函数地址。然后再调用时通过调用nativeFunc,即bridge函数,在此基础上基于libffi,实现跨平台无差异化调用真正的对应的native function。 关于java 中method的结构可参考对Java中method和class的管理和组织方法。
在注册过程中会,会根据注册提供的信息--className、MethodName去发射获取对象,查看需要绑定的对象和native method是否存在。
符合jni specification的本地函数的查找过程
相关代码位于:dalvik/vm/native.cpp
由于此种方式的调用,java中的native method中的nativeFunc被初始化的设置为dvmResolveNativeMethod;(实际上每个method都被初始化为dvmResolveNativeMethod)。
所以首次运行时会调用dvmResolveNativeMethod尝试去内部( dvmLookupInternalNativeMethod(method))以及已加载的so中尝试获取该相应的函数地址( lookupSharedLibMethod(method), 实际搜索过程在findMethodInLib中完成).如果是在lib中找到, 则通过dvmUseJNIBridge将method中的nativeFunc设置为相应的Bridge函数,ins设为func地址。
此后则无需搜索过程,直接调用即可。
对于在so中的函数搜索,判断依据是lib和method有相同的classLoader,且method对应的JNI name string的函数存在于lib中.(这通过dlopen和dlsym尝试获取地址来判断)。
参考
- 老罗 Dalvik虚拟机JNI方法的注册过程分析
- AOSP source code
native method与so中function的关联的更多相关文章
- Android Studio 项目中集成百度地图SDK报Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create:()I错误
Android Studio 项目中集成百度地图SDK报以下错误: java.lang.UnsatisfiedLinkError: Native method not found: com.baidu ...
- Javascript中Function,Object,Prototypes,__proto__等概念详解
http://anykoro.sinaapp.com/2012/01/31/javascript%E4%B8%ADfunctionobjectprototypes__proto__%E7%AD%89% ...
- Java Native Interface 六JNI中的异常
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 在这里只讨论调用JNI方法可能会出现的异常, ...
- Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name ...
- [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name cu ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- RDIFramework.NET 中多表关联查询分页实例
RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- NDK(3)java.lang.UnsatisfiedLinkError: Native method not found解决方法
调用native方法时报错如下 : “java.lang.UnsatisfiedLinkError: Native method not found.... ”: 原因分析: 链接器只看到了在so中 ...
随机推荐
- transition transform animate的使用
注:代码显示效果可以自行粘贴复制查看 transition(过渡),主要是关注property的变化主要有四个属性transition-property.transition-durantion.tr ...
- bzoj 3379 - [USACO2004] 交作业
Description 一个数轴上有 \(n \le 1000\) 个位置, 每个位置有一个时间 \(t_i\) 要求在 时刻 \(t_i\) 后, 至少经过该位置一次. (去交作业) 求从 \(0\ ...
- 平衡二叉树DSW算法
#include<iostream> #include<stdlib.h> #include<math.h> using namespace std; class ...
- tcpreplay 缓存算法研究
一. 缓存算法 1.1 算法目的 流量拆分算法的运算会明显影响包的发送速率,为了提高发送速率, tcpreplay 使用了缓存机制,该部分代码也封装在tcpprep工具里,运行 tcpprep ( ...
- 7.添加OpenStack计算服务
添加计算服务 安装和配置控制器节点 创建数据库 mysql -uroot -ptoyo123 CREATE DATABASE nova; GRANT ALL PRIVILEGES ON nova.* ...
- 关于boostrapValidator动态添加字段(addField)验证的bug
每次码博客,都觉得自己怀才不遇,哎~脑袋有瑕疵,文笔拿不粗手,就直接上干货吧. 在使用boostrapValidator这个验证插件的时候,如果某一个字段是动态添加来的,我们需要调用方法:addFie ...
- HDU5487 Difference of Languages(BFS)
题意:给你两个自动机,求出最短的(如果有相同最短的则求出字典序最小的)能被其中一个自动机接收而不能被另外一个自动机接收的字符串. 一看是自动机以为是神题,后来比赛最后才有思路. 两个自动机的状态都是小 ...
- Appium+python自动化11-adb必知必会的几个指令【转载】
前言 学android测试,adb是必学的,有几个常用的指令需要熟练掌握 一.检查设备 1.如何检查手机(或模拟器)是连上电脑的,在cmd输入: >adb devices
- 编码/解码和进制转化工具hURL
编码/解码和进制转化工具hURL 在安全应用中,各种编码方式被广泛应用,如URL编码.HTML编码.BASE64等.而在数据分析时候,各种进制的转化也尤为频繁.为了方便解决这类问题,Kali Li ...
- pyttsx的中文语音识别问题及探究之路
最近在学习pyttsx时,发现中文阅读一直都识别错误,从发音来看应该是字符编码问题,但搜索之后并未发现解决方案.自己一路摸索解决,虽说最终的原因非常可笑,大牛们可能也是一眼就能洞穿,但也值得记录一下. ...