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!

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

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

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...