转自:http://blog.csdn.net/ldj299/article/details/6299232
如果你对NDK开发的基本概念不是很了解,可以先看看我这篇文章:http://blog.csdn.net/ldj299/archive/2011/02/12/6181456.aspx
这是在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里的文件,然后运行程序你就回得到如下效果图: