在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. spring in action 学习笔记十:用@PropertySource避免注入外部属性的值硬代码化

    @PropertySource的写法为:@PropertySource("classpath:某个.properties文件的类路径") 首先来看一下这个案例的目录结构,重点看带红 ...

  2. 使用java的自定义过滤器Filter 处理请求request 并响应response

    package com.enation.eop; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...

  3. vue-cli打包后图片路径取不到的问题

    今天准备把vue-cli build 的文件发到服务器上单发现会出现图片找不到的问题 解决办法如下 修改 assetsPublicPath: './' .打开webpack.prod.conf.js, ...

  4. MySQL-based databases CVE -2016-6663 本地提权

    @date: 2016/11/3 @author: dlive 0x01 漏洞原文 翻译水平不高求轻喷 感觉作者在写文章的时候有些地方描述的也不是特别清楚,不过结合poc可以清晰理解漏洞利用过程 0x ...

  5. python每日一类(3):os和sys

    os与sys模块的官方解释如下: os: This module provides a portable way of using operating system dependent functio ...

  6. Codeforces Gym100952 C. Palindrome Again !!-回文字符串 (2015 HIAST Collegiate Programming Contest)

      C. Palindrome Again !!   time limit per test 1 second memory limit per test 64 megabytes input sta ...

  7. CF985A Chess Placing【思维】

    [链接]:CF985A [题意]:给你n和n/2个数ai,每个ai和奇数.偶数比较距离(注意选了奇数,偶数的距离就不要算了,反之同理),求最小的答案. [代码]: #include <iostr ...

  8. Nginx配置文件分析

    #user nobody; #启动进程数,即启动ngnix服务的个数,通常设置和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/e ...

  9. bzoj2440(莫比乌斯函数)

    bzoj2440 题意 求第 k 个不是完全平方数(除 1 以外)的正倍数的数. 分析 利用二分法求解,二分 x ,判断 x 是否是第 k 个数即可,那么我们就要计算 [1, x] 有几个符合条件的数 ...

  10. 清北·NOIP2017济南考前冲刺班 DAY1 morning

    立方数(cubic) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...