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中 ...
随机推荐
- linux下有的目录有可执行权限
在linux里面,目录也是一个文件.权限设置方法与普通文件一样.目录的可执行权限:目录无所谓执行不执行,目录只能否被开启(也称作“遍历”或“搜索”)对目录的执行权限不仅意味着查看目录下文件名还允许查看 ...
- [摸鱼] 配置的tmux的使用攻略!
o~/.tmux.conf <>=ctrl b <>$ 重命名 <>% 水平切割 <>" 垂直切割 <>o 下一个窗口 <& ...
- MFC中GetParent()的作用(转)
原文转自 https://bbs.csdn.net/topics/390540690 1.假如创建一个非模态的窗口,在如下两种做法里任选一种.(1) chatting.m_lpDlg = new CC ...
- 【转】Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04
原文链接:http://dblab.xmu.edu.cn/blog/install-hadoop/ 当开始着手实践 Hadoop 时,安装 Hadoop 往往会成为新手的一道门槛.尽管安装其实很简单, ...
- Charles安装
Charles 是一个网络抓包工具,在做 APP 抓包的时候会用到,相比 Fiddler 来说,Charles 的功能更为强大,而且跨平台支持更好,所以在这里我们选用 Charles 来作为主要的移动 ...
- [BZOJ4756][Usaco2017 Jan]Promotion Counting 树状数组
4756: [Usaco2017 Jan]Promotion Counting Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 305 Solved: ...
- 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?
开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...
- HDU 1171.Big Event in HDU-动态规划0-1背包
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 第十四届华中科技大学程序设计竞赛 C Professional Manager【并查集删除/虚点】
题目描述 It's universally acknowledged that there're innumerable trees in the campus of HUST. Thus a pro ...
- BZOJ 2243 [SDOI2011]染色 (树链剖分)(线段树区间修改)
[SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6870 Solved: 2546[Submit][Status][Disc ...