一、JNI调用流程


如图所示,Java要想调用Native,首先的一个问题是,我调用的Java方法将要调用的是哪个c++方法?
这个工作是由JVM来负责的,接到Java的调用请求后,JVM通过事先维护好的“Java方法”与“Native方法”的对应关系,来找到对应的Native方法。
找到对应的Native方法后,再调用这个Native方法。

第二个问题,那么这个“Java方法”与“Native方法”的对应关系是在哪里维护的呢?
Java中加载so库(System.loadLibrary(“xxx.so”))后,会执行一个JNI_OnLoad方法,来完成动态注册的工作,这个动态注册就是维护“Java方法”与“Native方法”的对应关系的。其具体实现是通过一个类名为“JNINativeMethod”结构体做为数据承载的:

typedef struct {const char* name; // java方法名const char* signature; // java方法二进制表示法void* fnPtr; // C函数指针
} JNINativeMethod

一目了然了。

二、JNIEvn 到底是个啥 ?

就是字面意思 JNI环境,JNIEvn主要作用就是:提供了一系列的JNI函数来实现调用 Java方法、操作jobject对象等。提供了 Native反调Java 的一种途径。以下是它的一部分代码:

JNIEvn是由JVM创建的,与线程相关。
在JNI环境下,可以通过以下两种方法,获取一个JNIEvn

(*jvm) -> AttachCurrentThread(jvm, (void**)&evn, NULL)
(*jvm) -> GetEnv(jvm, (void**)&evn, JNI_VERSION_1_2)

三、JNIEvn与JVM、线程的关系是怎么样的?

首先要明白,JVM是一个多线程运行的环境。Java方法调用Native,Native也相应地处于一个多线程运行的环境。那么如何表现上面的逻辑关系呢?

捋一下结构:
一个JVM里同时运行了多个线程,也就是Thread,JNIEvn作为Thread的一个线程本地变量的形式存在,也就是 TLS(Thread Local Storage)变量。它的通常写法如下:

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
类比我们的 JNIEvn ,伪代码可以写成这样:
ThreadLocal<JNIEvn> sJNIEnvLocal = new ThreadLocal<JNIEvn>();

也就是说多线程对应多个JNIEvn,这样就清晰一些了,JNIEvn是Native调用 Java的桥梁。通过上面和Thread的关系的分析,更准确地说,一个JNIEvn是在一个线程的环境下,使Native可以调用java方法。也就是下图红框部分:

四、JNIEnv 与 so加载


看图说话,也就是说,对于同一个so库来说,在不同的线程加载后,生成的JNIEnv是不同的。Native组件开发者 在写Native代码时,可以通过将JNIEnv作为参数传入方法中,判断JNIEnv的不同,而避免多线程访问同一资源冲突的问题,来实现线程安全。请参考以下代码:

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{JNIEvn* env = NULL;if (register_android_media_MediaPlayer(env) < 0) { // 将JNIEnv作为参数传入方法}
}register_android_media_MediaPlayer(JNIEvn* env){// 检查是否有其他很执行程序进入此物件,如果没有,则进入执行if ((*env) -> MonitorEnter(env, obj) != JNI_OK) {// do sth}
}

JNI 调用流程 与 JNIEvn逻辑概述相关推荐

  1. Android Camera调用流程

    一个流程图画的非常好的文章 http://blog.csdn.net/lushengchu_luis/article/details/11033095 1.Packages/apps/到framewo ...

  2. Android Camera(5)---Android Camera调用流程

    Android Camera调用流程 http://blog.csdn.net/lushengchu_luis/article/details/11033095 1.Packages/apps/到fr ...

  3. android sudio jni 调用so_UE4:UPL 与 JNI 调用的最佳实践

    本篇文章搬运自我自己的博客,原文链接: https://imzlp.me/posts/27289/ 作者: 查利鹏 在使用UE4开发Android时,有时需要获取平台相关的信息.或者执行平台相关的操作 ...

  4. Android Jni 调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...

  5. 【Android】JNI调用(完整版)

    原文出处:http://blog.csdn.net/kangyaping/article/details/6584027#t0 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... ...

  6. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  7. 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

    文章目录 一.进程注入原理 二.远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 ) 一.进程注入原理 调试进程 At ...

  8. Android JNI开发流程介绍

    1.什么是JNI JNI全称是Java Native Interface,中文称为Java本地接口.JNI是JAVA语言和C/C++语言沟通的协议,通过JNI,Java代码可以调用C.C++等语言写的 ...

  9. .net core 源码解析-mvc route的注册,激活,调用流程(三)

    .net core mvc route的注册,激活,调用流程 mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所指定的controller和action激活c ...

  10. RxJava Agera 从源码简要分析基本调用流程(2)

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由晋中望原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/communi ...

最新文章

  1. 浅谈先验分布和后验分布
  2. 信息系统项目管理案例2
  3. matlab dividend,[原创]基于(Matlab/R/C++)的方差Gamma模型(Hull期权期货)随机抽样[by fantuanxiaot]...
  4. AGC056E-Cheese【dp】
  5. 手把手教你搭建开发环境之Java开发
  6. python最大分词_中文分词算法之最大正向匹配算法(Python版)
  7. 安装windows服务提示输入用户名和密码
  8. Cmd下开启3389
  9. 在win10系统下安装ubuntu17.10以及基本配置
  10. jupternote不同类之间相互调用(调用ipynb文件)
  11. sw工程图导出bom_solidworks怎么导出带缩略图的BOM材料明细表?
  12. Google官方架构MVI
  13. 【数据清理与特征工程】2-数据清理
  14. Ubuntu 安装amd 显卡驱动
  15. PySpark处理数据并图表分析
  16. RS笔记:传统推荐模型之FFM (引入特征域的概念) [2015 Criteo]
  17. 【报告分享】2021天猫坚果消费趋势报告-CBNData(附下载)
  18. 3Dmax入门篇,常用快捷命令及两种基础建模方式,小白看了都会!
  19. 深度解密 Python 列表的实现原理
  20. SecureCRT和SecureFX

热门文章

  1. android通过adb截取屏幕、录制屏幕 screencap screenrecord
  2. N76E003替换STM8S003F3
  3. 基于STM8S003F3的数字温度计制作
  4. st8s003 c语言编译器,ST系列STM8S003F3P6单片机芯片介绍
  5. java实现聊天界面设计_java聊天室设计及实现
  6. 电力-101/104规约基础2
  7. 如何使用JSZip(How to use JSZip)
  8. 给mBlock添加扩展模块
  9. SWOT分析》思维导图,帮助你做好企业优势劣势分析图
  10. 关于路由表,ARP表,MAC表的一些理解