在安卓开发中,Java是主流的编程语言,但是C语言的优秀性能和广泛应用也使其在一些方面具备了很高的价值。C语言的图形开发工具也十分丰富,本文将介绍如何在安卓平台上使用C语言进行图形开发。
C语言常常出现在大家视野里的图形开发工具有两种OpenGL和SDL。这两个工具都可以在安卓平台上使用。
### OpenGL
OpenGL是一种跨平台的图形API,可以进行硬件加速的3D绘图。它是一种纯C的库,可以在所有有OpenGL实现的平台上使用,包括Windows、Linux、Mac和安卓等多种操作系统。
使用OpenGL进行图形开发时,需要先创建一个OpenGL的上下文环境。在安卓平台上,可以使用安卓 NDK提供的EGL库来创建OpenGL上下文环境。EGL库定义了一组函数,可以在安卓系统上创建和管理OpenGL的上下文环境。使用EGL库需要在安卓.mk文件中添加以下行
```makefile
LOCAL,LDLIBS := -lEGL -lGLESv2
```
然后,就可以借助EGL库来创建OpenGL上下文环境了
```c
EGLDisplay display;
EGLConfig config;
EGLContext context;
EGLSurface surface;
int sample,count = 4;
int depth,size = 24;
int stencil,size = 8;
int format = WINDOW,FORMAT,RGB,565;
EGLint num,configs;
EGLint config,attrs[] = {
EGL,RENDERABLE,TYPE, EGL,OPENGL,ES2,BIT,
EGL,SURFACE,TYPE, EGL,WINDOW,BIT,
EGL,SAMPLE,BUFFERS, (sample,count > 1) ? 1 : 0,
EGL,SAMPLES, sample,count,
EGL,DEPTH,SIZE, depth,size,
EGL,STENCIL,SIZE, stencil,size,
EGL,NONE
};
EGLint context,attrs[] = {
EGL,CONTEXT,CLIENT,VERSION, 2,
EGL,NONE
};
EGLint surface,attrs[] = {
EGL,NONE
};
display = eglGetDisplay(EGL,DEFAULT,DISPLAY);
eglInitialize(display, NULL, NULL);
eglChooseConfig(display, config,attrs, &config, 1, &num,configs);
eglBindAPI(EGL,OPENGL,ES,API);
context = eglCreateContext(display, config, EGL,NO,CONTEXT, context,attrs);
surface = eglCreateWindowSurface(display, config, surfaceHandle, surface,attrs);
eglMakeCurrent(display, surface, surface, context);
```
这段代码用到了EGL的一些函数,包括eglGetDisplay、eglInitialize、eglChooseConfig、eglBindAPI、eglCreateContext、eglCreateWindowSurface和eglMakeCurrent。其中,eglGetDisplay用来获取显示设备的句柄;eglInitialize用来初始化EGL库;eglChooseConfig用来选择合适的EGL配置,也就是创建OpenGL上下文环境所需要的一些参数;eglBindAPI用来指定使用OpenGL ES API;eglCreateContext用来创建OpenGL的上下文环境;eglCreateWindowSurface用来创建一个窗口表面,然后将窗口表面和OpenGL的上下文环境绑定在一起;eglMakeCurrent则用来设置当前的上下文环境。
在创建完OpenGL上下文环境之后,就可以使用OpenGL来进行图形绘制了。OpenGL可以绘制简单的点、线、三角形和四边形,也可以使用纹理来绘制更加复杂的图形。以下是一个简单的OpenGL绘制三角形的程序代码
```c
static const char gVertexShader[] =
attribute vec4 vPosition;\n
void main() {\n
gl,Position = vPosition;\n
}\n;
static const char gFragmentShader[] =
precision mediump float;\n
void main() {\n
gl,FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n
}\n;
GLuint program;
GLuint positionLoc;
GLfloat vertices[] = {
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f
};
glGenBuffers(1, &vbo);
glBindBuffer(GL,ARRAY,BUFFER, vbo);
glBufferData(GL,ARRAY,BUFFER, sizeof(vertices), vertices, GL,STATIC,DRAW);
GLuint vertexShader = loadShader(GL,VERTEX,SHADER, gVertexShader);
GLuint fragmentShader = loadShader(GL,FRAGMENT,SHADER, gFragmentShader);
program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glLinkProgram(program);
positionLoc = glGetAttribLocation(program, vPosition);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glUseProgram(program);
glEnableVertexAttribArray(positionLoc);
glVertexAttribPointer(positionLoc, 3, GL,FLOAT, GL,FALSE, 0, 0);
glDrawArrays(GL,TRIANGLES, 0, 3);
```
这段代码首先定义了一个三角形的顶点坐标,然后使用glGenBuffers创建了一个顶点缓冲区,并将顶点坐标数据传递到了缓冲区中。接着,使用loadShader函数加载了一个顶点着色器和一个片段着色器,然后通过glCreateProgram创建了一个着色器程序。将顶点着色器和片段着色器都链接到了这个着色器程序中。下一步,通过glGetAttribLocation函数获取了顶点坐标的属性位置,然后使用glUseProgram来将着色器程序设置为当前渲染程序。最后,使用glEnableVertexAttribArray和glVertexAttribPointer函数来设置顶点属性,并使用glDrawArrays来绘制出了这个三角形。
### SDL
SDL是一个跨平台的多媒体库,它可以用来进行图形、音频和输入输出操作。SDL也是一种纯C的库,可以在所有有SDL实现的平台上使用,包括Windows、Linux、Mac和安卓等多种操作系统。
在安卓平台上,也可以使用SDL来进行图形开发。使用SDL进行图形开发时,需要先创建一个SDL的窗口和渲染器,然后就可以使用SDL提供的绘制函数来进行图形绘制了。以下是一个简单的SDL绘制三角形的程序代码
```c
if(SDL,CreateWindowAndRenderer(320, 480, SDL,WINDOW,SHOWN, &window, &renderer) == 0) {
SDL,SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL,RenderClear(renderer);
SDL,SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);
SDL,RenderDrawLine(renderer, 0, 240, 320, 240);
SDL,RenderDrawLine(renderer, 160, 0, 160, 480);
SDL,RenderDrawLine(renderer, 0, 0, 320, 480);
SDL,RenderPresent(renderer);
}
```
这段代码首先使用SDL,CreateWindowAndRenderer函数创建了一个窗口和渲染器。然后,使用SDL,SetRenderDrawColor函数设置了渲染器的绘制颜色,并使用SDL,RenderClear函数清空了渲染器的缓冲区。接着,使用SDL,RenderDrawLine函数绘制了三条直线来组成了一个三角形。最后,使用SDL,RenderPresent函数将绘制的图形呈现到窗口中。
总的来说,C语言图形开发在安卓平台上依然有其存在的价值。OpenGL和SDL都是可行的方案,具体的开发过程需要根据应用的实际情况来选择适合的方案。