这是在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 (); } }
#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里的文件,然后运行程序你就回得到如下效果图:
转贴:http://blog.csdn.net/ldj299/article/details/6299232