12.2 Android中OpenGL软件层次栈
按照分层理念的设计,Android中的OpenGL实现也是层次设计的,形成了一个软件层次栈。最上面的是Java层,接着下面是JNI层,再调用下面的包裹(wrapper)层,包裹层下面则是OpenGL的软件实现或硬件实现。
图12-1给出了包android.opengl中的API类的调用层次关系。最上面虚线框图中左侧的四个类是OpenGL ES 1.0/1.1的API类,右侧的GLES 20是ES 2.0的API类。这五个类中的成员函数都是静态(static关键字)的,且是native的(意味着它们都由JNI层中的C++代码实现)。它们的JNI层代码位于frameworks/base/core/jni,因而封装在libandroid_runtime.so库中。JNI层中的C++代码将调用路径frameworks/native/opengl/libs(ICS及以前的版本是frameworks/base/opengl/libs)下面的代码生成的wrapper(包裹)库,见图12-1的最下面的虚线框。
图12-1 包android.opengl的调用层次栈图12-2则给出了包javax.microedition.khronos.opengles和包javax.microedition.khronos.egl的调用层次堆栈。
(点击查看大图)图12-2 OpenGL ES和EGL调用层次栈
如图12-2所示,最上面的左边的虚线框是包javax.microedition.khronos.opengles,它用于支持OpenGL ES1.0/1.1 API接口规范,右边的虚线框中的包javax.microedition.khronos.egl则是EGL接口。OpenGL ES 为附加功能和可能的平台特性开发提供了扩展机制,但仍然需要一个可以让 OpenGL ES 和本地视窗系统交互且与平台无关的层。EGL 就是 OpenGL ES 和底层 Native 平台视窗系统之间的接口。 OpenGL ES 本质上是一个图形渲染管线的状态机,而 EGL 则是用于监控这些状态以及维护Frame buffer 和其他渲染Surface 的外部层。EGL 包含了一组数据类型,同时也提供了对一组平台相关的本地数据类型的支持。
位于第二层的包com.google.android.gles_jni实现了其上面的接口类,它依赖于JNI层的C++实现,而JNI层则依赖于下面的包裹库。在后面的章节中还要具体讲述到,包裹库下面的是OpenGL的硬件实现库或软件实现库,它们通过专门的图形处理器或ARM应用处理器去实现真正的绘制功能。它们才是真正的OpenGL实现。
【责任编辑:book TEL:(010)68476606】
点赞 0