Binder机制,从Java到C (6. Binder in Native : libbinder)
1.Java和C++中的Binder
从前一篇 Binder机制,从Java到C (5. IBinder对象传递形式) 中可以看到,使用Binder的Java代码,到最后都会进入到Native环境,将具体的分发工作交给执行效率更高的Native代码。
而这些Native的实现都会统一到一个lib:libbinder。
在前面的讲述中,我们已经接触到了native中的JavaBBinder,BBinder,JavaBBinderHolder
把一些相关的类整理一下,可以得到下面Java和C++代码的关系:

Java环境里的Binder的对象,会通过JNI 调用init()方法,创建一个JavaBBinderHolder,从而使自己映射到Native环境里的BBinder。将两个环境里的Binder对象映射在一起。
2.transact()
BinderProxy中的transact()是以JNI的方式实现的,那它就是Java层和C++层的沟通纽带,Java通过它可以进一步和native交互。
Java环境里的的Binder,有一个private 的execTransact()方法,其实就是Native环境的callback,也就是C++层回到Java层的一个入口。
JNI代码在执行Native环境的onTransact()方法時,会通过回调Java环境里的execTransact()方法,从而回调到Java里实现的onTransact()方法。

3.libinder
Binder在Java环境中大量使用了面向对象的重构技巧,尽可能的实现通用操作。于是,为了支持给Java环境提供的灵活功能,在Native层的Binder,也需要具备面向对象的能力。libbinder的文件路径:
/framework/native/include/binder/
Binder.h
BinderService.h
BpBinder.h
Ibinder.h
IInterface.h
IPCThreadState.h
IpermissionController.h
IserviceManager.h
MemoryBase.h
MemoryDealer.h
MemoryHeapBase.h
Parcel.h
PermissionCache.h
ProcessState.h
/framework/native/lib/binder/binder/
Binder.cpp
BpBinder.cpp
Iinterface.cpp
Imemory.cpp
IPCThreadState.cpp
IpermissionController.cpp
IserviceManager.cpp
MemoryBase.cpp
MemoryDealer.cpp
MemoryHeapBase.cpp
Parcel.cpp
PermissionCache.cpp
ProcessState.cpp
Static.cpp
为了能映射Java代码,C++实现的Binder库会和Java环境里的Binder概念有相似互通之处:
IInterface.h,定义IInterface接口类。与Java的IInterface接口类对应,但与Java环境不同,C++环境里需要提供Binder通信实现,所以在内部被进一步拆分成BpInterface(Proxy端对象)、BnInterface(Stub端对象)两个模板,从而使用不同模板参数,可以使用对同一IInterface接口的访问,得到不同功能实现。
IBinder.h,定义IBinder接口类。与Java环境的IBinder对应,提供Binder引用,并定义Binder对象所应实现的方法。跟Java环境一样,IBinder对象会是分别引用到Proxy对象或是Stub对象。
Binder.h,定义BBinder类。BBinder类与Java环境里的Binder类对应,是Binder的Stub实现,通过onTransact()回调方法接收与处理Binder事件。但它更属于Binder通讯的基础类,并不会被直接使用,系统只会通过BBinder类的派生类进行通信,所以它的类名是BBinder,Base Binder的意思。
BpBinder.h,定义BpBinder类。与Java环境里的Stub.Proxy对象对应,是Binder的Proxy端实现。作为Proxy端,又是Binder最底层的封装,这一类的本质作用只是提供一个transact()方法,从而给上层封装的IPC请求提供最终的Binder通信接口。
Parcel.h,定义Parcel类。虽然概念上与Java里实现序列化的Parcel类是对应的,也提供同样的操作方法。但在实现上,Native环境里的Parcel是提供Java环境里的Parcel概念的一种基础,所有的Parcel的read|write_*()系列的方法,底层全是由Native代码来实现具体的读写操作。
4.Binder通信类
那有了Binder通信封装的类,如何操作Binder 驱动來通信呢?
在libbinder里,有两个专门的类來完成真正的Binder消息的读写操作 : ProcessState和IPCThreadState。
ProcessState.h,定义ProcessState类。正如这个类的名字所表述的,这个类的作用就是维护和IPC相关的process state,对于任一使用Binder的进程而言,进程空间里只会有一个ProcessState对象。
IPCThreadState.h,定义类IPCThreadState。这个类描述以thread为基础的IPC传输状态,Binder通信的读写过程便在这个类里完成。在IPCThreadState里,是以thread pool的方式來维护Binder的通信請求。
下面这个图就是整个通信的流程,蓝色部分是在Java里的,Java中通过BinderProxy的JNI调用,进入到Native层,然后通过IPCThreadState的talkwithDriver()和Binder驱动通信,Binder驱动在做了一系列处理后,找到目标进程,也是从talkwithDriver()方法回去,然后走到JavaBBinder的transact(),这里就会去调用进入Java层的入口函数execTransact()。再回到具体的执行函数。

5.辅助类
libbinder里会实现一些C++环境里的辅助类:
Imemory.h,生成两个远程接口类,IMemory和IMemoryHeap,分別用于使用内存和分配内存。对于內存使用两个基于IBinder的接口类,就意味着申请內存和分配內存可以分別由单独的process來提供。
MemoryDealer.h,定义一个默认的分配內存的MemoryDealer类。在这个类里有一个简单的內存管理算法,需要提供內存分配部分的时候,可以使用这个类來创建內存空间,并通过IMemoryHeap共享出去。
MemoryBase.h,提供IMemory接口类的Stub端實現。这个类是用在使用内存上的,可以通过它的getMemory()的方法返回一個IMemoryHeap实例。这个类是个基类,如果要使用IMemory接口,可以继承这个类。
MemoryHeapBase.h,提供IMemoryHeap接口类的Stub端。用于远程共享的堆空間分配,根据不同的情况分配不同类型的內存。
MemoryHeapPmem.h,实现基于Pmem机制(为了实现共享大尺寸连续物理內存而开发的一种机制)并实现了IMemoryHeap接口。如果有特殊內存堆的使用需求,可以通过MemoryHeadBase类派生出新的MemoryHead类,就像这个MemoryHeapPmem。
Binder机制,从Java到C (6. Binder in Native : libbinder)的更多相关文章
- Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制?
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- 【转】Android - Binder机制
以下几篇文章是分析binder机制里讲得还算清楚的 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通servic ...
- 从mediaserver入手快速理解binder机制(最简单理解binder)【转】
本文转载自;https://blog.csdn.net/u010164190/article/details/53015194 Android的binder机制提供一种进程间通信的方法,使一个进程可以 ...
- Binder机制1---Binder原理介绍
1.Binder通信机制介绍 这篇文章会先对照Binder机制与Linux的通信机制的区别,了解为什么Android会另起炉灶,採用Binder.接着,会依据Binder的机制,去理解什么是Servi ...
- 了解Binder机制原理和底层实现
参考:http://www.2cto.com/kf/201606/515548.html 1.Binder通信机制介绍 这篇文章会先对比Binder机制与Linux的通信机制的差别,了解为什么Andr ...
- Android系统Binder机制学习总结
一.Binder机制概述 在Android开发中,很多时候我们需要用到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,比如说socket.pipe等,Android中进程间通信的方式主要有三 ...
- android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口
Binder间进程通信的JAVA层接口,主要是通过JNI方法来调用Binder库的C/C++接口 在JAVA层,将Service组件称为JAVA服务,Service组件的代理称为JAVA服务代理. 一 ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Binder机制,从Java到C (大纲)
转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan/p/3487381.html 前段时间一直在看有关Binder机制的内容,觉得受益匪浅,整理记录于此,大家请随 ...
- Binder机制,从Java到C (1. IPC in Application Remote Service)
转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan 1. Application 中的 service 我们知道Android中Service有三种类型:Loca ...
随机推荐
- POJ 1066 Treasure Hunt(相交线段&&更改)
Treasure Hunt 大意:在一个矩形区域内.有n条线段,线段的端点是在矩形边上的,有一个特殊点,问从这个点到矩形边的最少经过的线段条数最少的书目,穿越仅仅能在中点穿越. 思路:须要巧妙的转换一 ...
- 大数据系列修炼-Scala课程08
接下来会讲解关于各种模式匹配,从中就会知道模式匹配的重要性 关于Type.Array.List.Tuple模式解析 1.Type模式匹配代码解析 //关于Type类型的模式匹配 //匹配 Int类型. ...
- eclipse打不开data目录解决的方法
1.首先手机必须详细root权限.没有的话,先去root. 2.root过后若还是不能打开,下载一个R.E管理器,然后将须要打开的目录设置为可读.可写.可运行. 附图:
- Codeforces 328B-Sheldon and Ice Pieces(馋)
B. Sheldon and Ice Pieces time limit per test 1 second memory limit per test 256 megabytes input sta ...
- Redis 安装与简单示例
Redis 安装与简单示例 一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或 ...
- 让你的Windows不断重启的C语言代码
原文:让你的Windows不断重启的C语言代码 没有写Linux的原因是因为搞不定Linux下的权限问题,而Windows下基本上使用电脑的用户都是管理员,所以钻个空了,不多说下面是代码#includ ...
- C语言库函数大全及应用实例十三
原文:C语言库函数大全及应用实例十三 [编程资料]C语言库函数大全及应用实例十三 函数名: stat 功 能: 读取打 ...
- JQ优化性能
一.注意定义jQuery变量的时候添加var关键字这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下:$loading = $('#loading'); / ...
- PHP调用Webservice实例
原文 PHP调用Webservice实例 NuSoap是PHP环境下的WebService编程工具,用于创建或调用WebService.它是一个开源软件,是完全采用PHP语言编写的.通过HTTP收发S ...
- CodeSmith 生成代码
使用CodeSmith 生成代码 CodeSmith是一款优秀的代码生成工具.在ORM中,它能帮助我们生成实体类.XML配置文件,从而简化了我们一部分的开发工作.下面简要说说它的基本用法. 1. 打 ...