Android 3D学习之利用NDK绘制2D四边形

来源:互联网 发布:java子类重写父类权限 编辑:程序博客网 时间:2024/06/05 11:10

这是在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里的文件,然后运行程序你就回得到如下效果图:



转贴:http://blog.csdn.net/ldj299/article/details/6299232

原创粉丝点击