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

这是在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值