Android NDK opengl ES
来源:互联网 发布:868mhz知乎 编辑:程序博客网 时间:2024/06/02 16:32
Android 2010-05-24 08:49:25 阅读272 评论0 字号:大中小 订阅 Android SDK 提供了一套 OpenGL ES 接口,该接口是基于 Java 的,速度非常慢,往往很难满足需要。 NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将 so和 java 应用一起打包成 apk。使用 NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。如 OpenGL ES 的程序。2 对于 NDK,在 Java 代码中调用 C/C++ 代码是通过 JNI 实现的。 Java Native Interface(JNI)是 Java 语言的本地编程接口,在java程序中,我们可以通过 JNI 实现一些用 java 语言不便实现的功能。通常有以下几种情况我们需要使用 JNI 来实现: 注意,不到万不得已不要使用 JNI 技术,一方面它需要你把握更多的知识才可以驾驭,一方面使用了 JNI 你的程序就会丧失可移植性。 我们可以把 JNI 想象为本地代码和 java 代码的粘合剂,关系如下图所示3: 注意:EGL Context Lost There are situations where the EGL rendering context will be lost. This typically happens when device wakes up after going to sleep. When the EGL context is lost, all OpenGL resources (such as textures) that are associated with that context will be automatically deleted. In order to keep rendering correctly, a renderer must recreate any lost resources that it still needs. The onSurfaceCreated(GL10, EGLConfig) method is a convenient place to do this. 要想在 jni native 代码中看打印信息,printf 是不行的,需使用 __android_log_print,如下所示。 该函数与 printf 用法相似,使用格式字符。打印的结果通过 logcat 查看。 注意,使用时需要将头文件 android/log.h 包含进来。 为方便使用,往往定义一些宏Android NDK opengl ES
NDK 简介
JNI
OpenGL ES
Java 端核心代码如下所示:
public class DemoAct extends Activity { private GLSurfaceView mGLView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLView = new DemoGLSurfaceView(this); setContentView(mGLView); } ... ... static { System.loadLibrary("sanangeles"); }}class DemoGLSurfaceView extends GLSurfaceView { DemoRenderer mRenderer; public DemoGLSurfaceView(Context context) { super(context); mRenderer = new DemoRenderer(); setRenderer(mRenderer); }class DemoRenderer implements GLSurfaceView.Renderer { private static native void nativeInit(); private static native void nativeResize(int w, int h); private static native void nativeRender(); private static native void nativeDone(); public void onSurfaceCreated(GL10 gl, EGLConfig config) { nativeInit(); } public void onSurfaceChanged(GL10 gl, int w, int h) { nativeResize(w, h); } public void onDrawFrame(GL10 gl) { nativeRender(); }}
JNI 代码如下所示:
#include <jni.h>.../* Call to initialize the graphics state */voidJava_com_example_AndMii_DemoRenderer_nativeInit( JNIEnv* env ){ appInit();}/* Call to finalize the graphics state */voidJava_com_example_AndMii_DemoRenderer_nativeDone( JNIEnv* env ){ free objects.}/* Call to render the next GL frame */voidJava_com_example_AndMii_DemoRenderer_nativeRender( JNIEnv* env ){ curTime = ... appRender(curTime, sWindowWidth, sWindowHeight);}
C 语言端
void appInit(){ glEnable(GL_NORMALIZE); glEnable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glShadeModel(GL_FLAT); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_LIGHT2); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY);}// Called from the app framework./* The tick is current time in milliseconds, width and height * are the image dimensions to be rendered. */void appRender(long tick, int width, int height){ // Prepare OpenGL ES for rendering of the frame. prepareFrame(width, height); // Configure environment. configureLightAndMaterial(); // Draw all the models normally. drawModels(1);}static void prepareFrame(int width, int height){ glViewport(0, 0, width, height); glClearColorx((GLfixed)(0.1f * 65536), (GLfixed)(0.2f * 65536), (GLfixed)(0.3f * 65536), 0x10000); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, (float)width / height, 0.5f, 150); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}static void configureLightAndMaterial(){ static GLfixed light0Position[] = { -0x40000, 0x10000, 0x10000, 0 }; static GLfixed light0Diffuse[] = { 0x10000, 0x6666, 0, 0x10000 }; static GLfixed light1Position[] = { 0x10000, -0x20000, -0x10000, 0 }; static GLfixed light1Diffuse[] = { 0x11eb, 0x23d7, 0x5999, 0x10000 }; static GLfixed light2Position[] = { -0x10000, 0, -0x40000, 0 }; static GLfixed light2Diffuse[] = { 0x11eb, 0x2b85, 0x23d7, 0x10000 }; static GLfixed materialSpecular[] = { 0x10000, 0x10000, 0x10000, 0x10000 }; glLightxv(GL_LIGHT0, GL_POSITION, light0Position); glLightxv(GL_LIGHT0, GL_DIFFUSE, light0Diffuse); glLightxv(GL_LIGHT1, GL_POSITION, light1Position); glLightxv(GL_LIGHT1, GL_DIFFUSE, light1Diffuse); glLightxv(GL_LIGHT2, GL_POSITION, light2Position); glLightxv(GL_LIGHT2, GL_DIFFUSE, light2Diffuse); glMaterialxv(GL_FRONT_AND_BACK, GL_SPECULAR, materialSpecular); glMaterialx(GL_FRONT_AND_BACK, GL_SHININESS, 60 << 16); glEnable(GL_COLOR_MATERIAL);}static void drawModels(float zScale){ glVertexPointer(......); glColorPointer(......); if (normalArray != NULL) { glNormalPointer(GL_FIXED, 0, normalArray); glEnableClientState(GL_NORMAL_ARRAY); } else glDisableClientState(GL_NORMAL_ARRAY); glDrawArrays(GL_TRIANGLES, 0, object->count);}
调试
__android_log_print(ANDROID_LOG_INFO, "ProjectName", "I am : %d/n", n);
#include <android/log.h>#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "ProjectName", __VA_ARGS__)#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "ProjectName", __VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "ProjectName", __VA_ARGS__)
- Android NDK opengl ES
- 基于 Android NDK 进行 OpenGL ES开发
- 基于 Android NDK 进行 OpenGL ES开发
- Android 如何使用NDK开发OPenGL ES
- 基于 Android NDK 进行 OpenGL ES开发
- Android 如何使用NDK开发OPenGL ES
- 基于 Android NDK 进行 OpenGL ES开发
- 基于 Android NDK 进行 OpenGL ES开发
- 基于 Android NDK 进行 OpenGL ES开发
- 基于 Android NDK 进行 OpenGL ES开发
- Android NDK Opengl es开发初步接触
- 基于 Android NDK 进行 OpenGL ES开发
- Android NDK 开发OpenGL ES 2.0一些注意点
- ndk jni Android OpenGL es 2.0 课程分享
- android opengl es 源码
- android的opengl es
- android opengl es--立方体
- Android OpenGL ES
- 智能卡操作系统COS概述
- 工作上的事情
- rank,learning to rank 方面的paper
- new sql
- Google公开Megastore论文——解决NoSQL、SQL融合难题
- Android NDK opengl ES
- 群发淘宝消息 另外的思路 使用 UI Automation 和 api
- [IBM dW] NoSQL数据建模
- scp(远程文件复制)指令详解
- hard limits
- 关于构造函数
- 路由下套无线路由当交换机用
- 一个成熟的java软件工程师学习osgi应该这样
- ubuntu svn