展会信息港展会大全

android开发之Surface系统本地代码Java代码之间的关系
来源:互联网   发布日期:2015-10-13 07:39:59   浏览:2772次  

导读:Surface系统在Android中本意是提供一个供显示使用的界面,其它程序可以在这个界面上进行显示输出。Surface系统可以实现多层的Surface,这样对于每一个程序调用者,都可以认为是在独有的界面上进行绘制;而多层次 ...

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系统接口结构如下:

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

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实现的结构如下:

Surface系统在上图中,虚线以上的部分是在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()

继续调用SurfaceFlinger::createSurface()函数,

控制过程类似。

③SurfaceFlinger和显示硬件的接口

SurfaceFlinger可以支持图形层的创建、叠加、混合等功能,这些功能的基础是SurfaceFlinger需要有一个显示设备。在其处理过程中,这个显示设备是由DisplayHardware目录中的DisplayHardware.cpp文件来实现的,其中创建了一个DisplayHardware来作为主要的显示界面。

mDisplaySurface = new EGLDisplaySurface()

EGLDisplaySurface类是在libui中实现的,它直接操作Framebuffer的硬件驱动。在SurfaceFlinger.cpp中,将创建类DisplayHardware的实例,从而获取实际的显示设备,在上面进行显示输出。

此外,SurfaceFlinger可以使用可选的硬件模块copybit作为2D图形处理部分的加速器,该部分内容的接口是在frameworks/base/include/core/java/android/hardware目录的copybit.h文件中定义的相关接口,作为硬件模块使用。这个模块在DisplayHardware初始化的过程中被打开。

3.Surface的Java和JNI代码

Surface系统通过JNI向Java框架层提供接口,在Java框架层根据Surface系统提供的接口构建各个UI元素。Surface部分JNI代码的路径为:frameworks/base/core/jni/android_view_Surface.cpp。它主要提供了android.view.SurfaceSession和android.view.Surface两个Java类,分别调用SurfaceComposerClient和Surface两个本地类来完成实现。Surface部分的Java代码的路径为:frameworks/base/core/java/android/view/,Surface部分对应的Java类在android.view包中,除了上面提到的类SurfaceSession和Surface之外,与其相关的还有接口SurfaceHolder和类SurfaceView。android.view.Surface表示一个可以绘制图形的界面,它实际上是调用底层的Surface接口来实现控制的硬件载体。它们之间的关系如下:

Surface系统事实上,在Java框架中,所以UI元素的基类都是android.view.View,这些UI元素本身也是基于Surface及2D绘图函数来实现的。如果需要在Java程序中使用一个可以进行自由绘制的界面,那么就需要使用类android.view.SurfaceView,这个类也继承了android.view.View,因此也是Android中的一个UI元素。android.view.SurfaceHolder是android.view.SurfaceView中包含的一个接口,用于处理Surface相关的事件。

赞助本站

人工智能实验室
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港