在Android中,可以通过JNI的方式来调用和访问用C/C++实现的代码,这些代码以SharedLibrary的方式存在于so中。从Java Code到Native Code的一般使用过程为:

  1. 在Java中的某个类中调用System.loadLibrary(XXX)(对于ing的so的全名应为:libXXX.so),或者System.load(soPathName)(soPathName对应于要加载的某个so的完整路径及文件名)来加载so;
  2. 声明所要调用的静态方法,即需要和so中函数关联的方法名:需要关键字native
  3. 编写so,实现声明的native method的功能。
  4. 与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尝试获取地址来判断)。

参考

  1. 老罗 Dalvik虚拟机JNI方法的注册过程分析
  2. AOSP source code

native method与so中function的关联的更多相关文章

  1. 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 ...

  2. Javascript中Function,Object,Prototypes,__proto__等概念详解

    http://anykoro.sinaapp.com/2012/01/31/javascript%E4%B8%ADfunctionobjectprototypes__proto__%E7%AD%89% ...

  3. Java Native Interface 六JNI中的异常

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 在这里只讨论调用JNI方法可能会出现的异常, ...

  4. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

  5. [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       cu ...

  6. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  7. RDIFramework.NET 中多表关联查询分页实例

    RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...

  8. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  9. NDK(3)java.lang.UnsatisfiedLinkError: Native method not found解决方法

    调用native方法时报错如下 : “java.lang.UnsatisfiedLinkError: Native method not found....  ”: 原因分析: 链接器只看到了在so中 ...

随机推荐

  1. linux下有的目录有可执行权限

    在linux里面,目录也是一个文件.权限设置方法与普通文件一样.目录的可执行权限:目录无所谓执行不执行,目录只能否被开启(也称作“遍历”或“搜索”)对目录的执行权限不仅意味着查看目录下文件名还允许查看 ...

  2. [摸鱼] 配置的tmux的使用攻略!

    o~/.tmux.conf <>=ctrl b <>$ 重命名 <>% 水平切割 <>" 垂直切割 <>o 下一个窗口 <& ...

  3. MFC中GetParent()的作用(转)

    原文转自 https://bbs.csdn.net/topics/390540690 1.假如创建一个非模态的窗口,在如下两种做法里任选一种.(1) chatting.m_lpDlg = new CC ...

  4. 【转】Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04

    原文链接:http://dblab.xmu.edu.cn/blog/install-hadoop/ 当开始着手实践 Hadoop 时,安装 Hadoop 往往会成为新手的一道门槛.尽管安装其实很简单, ...

  5. Charles安装

    Charles 是一个网络抓包工具,在做 APP 抓包的时候会用到,相比 Fiddler 来说,Charles 的功能更为强大,而且跨平台支持更好,所以在这里我们选用 Charles 来作为主要的移动 ...

  6. [BZOJ4756][Usaco2017 Jan]Promotion Counting 树状数组

    4756: [Usaco2017 Jan]Promotion Counting Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 305  Solved: ...

  7. 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?

    开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...

  8. 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 ...

  9. 第十四届华中科技大学程序设计竞赛 C Professional Manager【并查集删除/虚点】

    题目描述 It's universally acknowledged that there're innumerable trees in the campus of HUST. Thus a pro ...

  10. BZOJ 2243 [SDOI2011]染色 (树链剖分)(线段树区间修改)

    [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6870  Solved: 2546[Submit][Status][Disc ...