android开发之Surface系统本地代码Java代码之间的关系

  次阅读 来源:互联网(转载协议) 2015-10-03 15:16 我要评论(0)

Surface系统在Android中本意是提供一个供显示使用的界面,其它程序可以在这个界面上进行显示输出。Surface系统可以实现多层的Surface,这样对于每一个程序调用者,都可以认为是在独有的界面上进行绘制;而多层次的叠加和管理,则由Surface系统来完成。Surface系统包含了本地代码和Java代码部分,它们之间的关系如下:

libui提供本地的Surface系统框架

surfaceflinger完成本地接口的实现

Java框架层次主要调用Surface向UI提供接口

本地部分可以使用ISurface接口

1.Surface系统本地接口

在libui中,定义了Surface系统的本地接口,这些本地接口构成了Surface系统的新框架,路径为frameworks/base/include/ui/,主要包括的头文件为:Surface.h、SurfaceComposerClient.h、ISurface.h、ISurfaceFlingerClient.h和ISurfaceComposer.h。Surface.h和SurfaceComposerClient.h是为上层提供的调用接口,通过Surface系统的JNI提供给Java层使用;ISurface.h、ISurfaceFlingerClient.h和ISurfaceComposer.h是需要下层去继承和实现的接口,其中ISurface.h中的接口可以给本地程序来调用,进而实现图形数据输出功能。Surface系统接口结构如下:

在ISurfaceComposer.h接口中,定义了Surface系统的各种枚举值和接口:

调用createConnection()接口将构建一个ISurfaceFlingerClient,而eFXSurfaceNormal、eFXSurfaceBlur、eFXSurfaceDim和eFXSurfaceMask表示不同类型的Surface层次,它们和Java代码是对应的(对应于Surface.java文件)。

2.SurfaceFlinger本地代码

①整体结构

SurfaceFlinger是Surface部分的本地实现,实现了Surface的建立、控制、管理等功能,其代码路径为:frameworks/base/libs/surfaceflinger/。SurfaceFlinger的生成目标是动态库libsurfaceflinger.so,这个库是继承libui的头文件提供的类而实现的,没有独立的头文件。外部进行调用的接口是libui的头文件。在SurfaceFlinger.h和SurfaceFlinger.cpp文件中,SurfaceFlinger类继承了ISurfaceComposer,是一个核心的实现;SurfaceFlinger::BClient类继承了ISurfaceFlingerClient。另一个重要部分就是提供不同的层(Layer),用于构建不同的显示界面。SurfaceFlinger实现的结构如下:

在上图中,虚线以上的部分是在libui中定义的接口,虚线以下的部分是SurfaceFlinger对接口的实现,其中最核心的类是SurfaceFlinger。在SurfaceFlinger内部,有一个表示Surface层次的类LayerBase,它提供了与上层相关的通用接口(例如,设置层的位置和大孝Z方向的索引、绘制等)。LayerBaseClient继承了LayerBase,而LayerBaseClient的内部类Surface又继承了BnSurface,如下:

class LayerBaseClient:public LayerBase{

class Surface:public BnSurface{};

};

这个LayerBaseClient是各种层的基类,它被以下其它几个类继承:Layer、LayerBuffer、LayerDim、LayerBlur。这几个类表示了几种不同的 层 ,它们之间的继承关系如下:

class Layer:public LayerBaseClient{};

class LayerBuffer:public LayerBaseClient{

class SurfaceBuffer:public LayerBaseClient::Surface{};

};

class LayerDim:public LayerBaseClient{};

class LayerBlur:public LayerBaseClient{};

在以上的几个类中,LayerBuffer中的SurfaceBuffer继承了本地的ISurface接口,即本地使用的ISurface接口在Android的图形中只有LayerBuffer中的一个实现。

②创建和控制Surface的过程

在上层程序的调用过程中,创建一个Surface的过程如下所示:

调用libui的接口SurfaceComposerClient::createSurface()

调用ISurfaceFlingerClient::createSurface()

由于继承关系,实际上调用的是SurfaceFlinger中的接口,即BClient::createSurface()

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...