这是在Activity中的重要代码:
package com.ldj.hellondk;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
public class HelloNDK extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView surface = new GLSurfaceView(this);
surface.setRenderer(new NdkGLRenderer());
setContentView(surface);
}
static {
//加载本地共享库
System.loadLibrary("NdkGLRenderer");
}
}
这里面主要是创建一个GLSurfaceView对象且绑定渲染,并且加载了本地共享库。
接下来看NdkGLRenderer这个渲染类:
package com.ldj.hellondk;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
public class NdkGLRenderer implements Renderer {
/*
* 声明了三个本地方法并且在Java中调用
*
*/
native private void onNdkSurfaceCreated ();
native private void onNdkSurfaceChanged (int width, int height);
native private void onNdkDrawFrame ();
public void onDrawFrame(GL10 gl) {
onNdkDrawFrame ();
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
onNdkSurfaceChanged (width, height);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
onNdkSurfaceCreated ();
}
}
接下来就是这三个本地方法的实现了,hello-ndk.c:
#include <jni.h>
#include <GLES/gl.h>
unsigned int vbo[2];
float positions[12] = {1,-1,0, 1,1,0, -1,-1,0, -1,1,0};
short indices [4] = {0,1,2,3};
void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceCreated (JNIEnv* env, jobject obj)
{
//生成两个缓存区对象
glGenBuffers (2, vbo);
//绑定第一个缓存对象
glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
//创建和初始化第一个缓存区对象的数据
glBufferData (GL_ARRAY_BUFFER, 4*12, positions, GL_STATIC_DRAW);
//绑定第二个缓存对象
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
//创建和初始化第二个缓存区对象的数据
glBufferData (GL_ELEMENT_ARRAY_BUFFER, 2*4, indices, GL_STATIC_DRAW);
}
void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceChanged (JNIEnv* env, jobject obj, jint width, jint height)
{
//图形最终显示到屏幕的区域的位置、长和宽
glViewport (0,0,width,height);
//指定矩阵
glMatrixMode (GL_PROJECTION);
//将当前的矩阵设置为glMatrixMode指定的矩阵
glLoadIdentity ();
glOrthof (-2, 2, -2, 2, -2, 2);
}
void Java_com_ldj_hellondk_NdkGLRenderer_onNdkDrawFrame (JNIEnv* env, jobject obj)
{
//启用顶点设置功能,之后必须要关闭功能
glEnableClientState (GL_VERTEX_ARRAY);
//清屏
glClearColor (0,0,1,1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
//定义顶点坐标
glVertexPointer (3, GL_FLOAT, 0, 0);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
//按照参数给定的值绘制图形
glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);
//关闭顶点设置功能
glDisableClientState(GL_VERTEX_ARRAY);
}
代码中的注释应该是比较详细的,和用Java来实现此功能的代码其实还是差不多的,
最后在Android.mk中告诉NDK需要编译哪些文件,生成哪些模块。
本文的源程序下载地址:http://download.csdn.net/source/3154085
利用ndk-build命令编译jni里的文件,然后运行程序你就回得到如下效果图: