




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于 Android NDK 进行 OpenGL ES开发2011-8-23NDK 简介Android SDK 提供了一套 OpenGL ES 接口,该接口是基于 Java 的,速度非常慢,往往很难满足需要。NDK 提供了一系列的工具,帮助开发者快速开发C(或C+)的动态库,并能自动将 so和 java 应用一起打包成 apk。使用 NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。如 OpenGL ES 的程序。JNI对于 NDK,在 Java 代码中调用 C/C+ 代码是通过 JNI 实现的。Java Native Interface(JNI)是 Java 语言的本地编程接口,在java程序中,我们可以通过 JNI 实现一些用 java 语言不便实现的功能。通常有以下几种情况我们需要使用 JNI 来实现:1. java 类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的; 2. 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的; 3. 程序的某些部分对速度要求比较苛刻,你选择用汇编或者 c 语言来实现并在 java 语言中调用他们。 注意,不到万不得已不要使用 JNI 技术,一方面它需要你把握更多的知识才可以驾驭,一方面使用了 JNI 你的程序就会丧失可移植性。我们可以把 JNI 想象为本地代码和 java 代码的粘合剂,关系如下图所示3:以上是在网上拷贝过来的,感觉有助于理解接下来正式分析实例首先,你的电脑必须搭建好了Android SDK和NDK开发环境,如果没有搭建,可以参考我之前写过的文档。 首先我们来看看java程序package com.example.SanAngeles;import javax.microedition.khronos.egl.EGLConfig;/*GL10表示1.0版本*/import javax.microedition.khronos.opengles.GL10;import android.app.Activity;import android.content.Context;import android.opengl.GLSurfaceView;import android.os.Bundle;import android.view.MotionEvent;public class DemoActivity extends Activity Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); mGLView = new DemoGLSurfaceView(this); setContentView(mGLView); Override protected void onPause() super.onPause(); mGLView.onPause(); Override protected void onResume() super.onResume(); mGLView.onResume(); private GLSurfaceView mGLView; static System.loadLibrary(sanangeles); /*GLSurfaceView 是用来显示OpenGL视图的*/class DemoGLSurfaceView extends GLSurfaceView public DemoGLSurfaceView(Context context) super(context); mRenderer = new DemoRenderer(); setRenderer(mRenderer); public boolean onTouchEvent(final MotionEvent event) if (event.getAction() = MotionEvent.ACTION_DOWN) nativePause(); return true; DemoRenderer mRenderer; private static native void nativePause();/*Renderer是用来专门渲染3D的接口*/class DemoRenderer implements GLSurfaceView.Renderer /*当窗口被创建时需要调用onSurfaceCreated 在这里我们做了一些初始化的工作*/ public void onSurfaceCreated(GL10 gl, EGLConfig config) nativeInit(); /*当窗口改变大小时会调用下面的方法*/ public void onSurfaceChanged(GL10 gl, int w, int h) /gl.glViewport(0, 0, w, h); nativeResize(w, h); /*所以的绘图工作 都在下面的函数中进行*/ public void onDrawFrame(GL10 gl) nativeRender(); private static native void nativeInit(); private static native void nativeResize(int w, int h); private static native void nativeRender(); private static native void nativeDone();看到上面的程序,你可能有点晕,我一开始也是同样的感觉。可是你如果利用过Android SDK中提供的OpenGL API进行过开发,那么上面的代码你应该相当的熟悉。这是做SDK开发3D程序的基本框架。接下来,我们简单的了解一下这个框架,我之前也没做过这方面的,所以只能简单的介绍下,不过我相信你们应该比我熟悉。Android为我们提供了GLSurfaceView来更好地显示OpenGL视图,而GLSurfaceView中则包含了一个专门用来渲染3D的接口Readerer。所以在程序中除了Activity类外,还有两个类分别是继承GLSurfaceView和Readerer的。其中在GLReader中我们必须实现下面三个抽象方法:1. public void onSurfaceCreated(GL10 gl, EGLConfig config) 当窗口被创建时需要调用onSurfaceCreated 在这里我们做了一些初始化的工作。2. public void onSurfaceChanged(GL10 gl, int w, int h) 当窗口改变大小时会调用下面的方法3 public void onDrawFrame(GL10 gl) 所以的绘图工作 都在下面的函数中进行 以上是我们看到在SDK中怎么去建立一个3D的基本框架,接下来我们需要看看本地的JNI是怎么实现的?#include #include #include #include #include int gAppAlive = 1;static int sWindowWidth = 320;static int sWindowHeight = 480;static int sDemoStopped = 0;static long sTimeOffset = 0;static int sTimeOffsetInit = 0;static long sTimeStopped = 0;static long_getTime(void) struct timeval now; gettimeofday(&now, NULL); return (long)(now.tv_sec*1000 + now.tv_usec/1000);/* Call to initialize the graphics state */voidJava_com_example_SanAngeles_DemoRenderer_nativeInit( JNIEnv* env ) importGLInit(); appInit(); gAppAlive = 1; sDemoStopped = 0; sTimeOffsetInit = 0;voidJava_com_example_SanAngeles_DemoRenderer_nativeResize( JNIEnv* env, jobject thiz, jint w, jint h ) sWindowWidth = w; sWindowHeight = h; _android_log_print(ANDROID_LOG_INFO, SanAngeles, resize w=%d h=%d, w, h);/* Call to finalize the graphics state */voidJava_com_example_SanAngeles_DemoRenderer_nativeDone( JNIEnv* env ) appDeinit(); importGLDeinit();/* This is called to indicate to the render loop that it should * stop as soon as possible. */voidJava_com_example_SanAngeles_DemoGLSurfaceView_nativePause( JNIEnv* env ) sDemoStopped = !sDemoStopped; if (sDemoStopped) /* we paused the animation, so store the current * time in sTimeStopped for future nativeRender calls */ sTimeStopped = _getTime(); else /* we resumed the animation, so adjust the time offset * to take care of the pause interval. */ sTimeOffset -= _getTime() - sTimeStopped; /* Call to render the next GL frame */voidJava_com_example_SanAngeles_DemoRenderer_nativeRender( JNIEnv* env ) long curTime; /* NOTE: if sDemoStopped is TRUE, then we re-render the same frame * on each iteration. */ if (sDemoStopped) curTime = sTimeStopped + sTimeOffset; else curTime = _getTime() + sTimeOffset; if (sTimeOffsetInit = 0) sTimeOffsetInit = 1; sTimeOffset = -curTime; curTime = 0; /_android_log_print(ANDROID_LOG_INFO, SanAngeles, curTime=%ld,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《水循环的原理与意义:初中地理教学教案》
- 2022学年上海进才中学高一(下)期中历史试题及答案
- 诗歌鉴赏技巧与方法:高一语文诗歌教学教案
- 书包苹果250字(9篇)
- 八面山公司团建活动方案
- 公交公司清明节活动方案
- 公交爱心活动方案
- 公众互动展览活动方案
- 公众微信推广活动方案
- 公共机构节能活动方案
- 福建省福州市2023−2024学年高一下册期末考数学试卷附解析
- 2024年中国铁路成都局集团有限公司招聘考试《铁路基本常识》真题库及答案
- 生态草场使用权转让协议
- 粮食熏蒸作业管理制度
- 医院医保奖惩管理制度
- 2025年中级经济师之中级经济师金融专业题库练习试卷A卷附答案
- Python数据科学与机器学习结合试题及答案
- 2025-2030中国EHS管理软件行业市场现状供需分析及投资评估规划分析研究报告
- 海鲜水产电商商业计划书
- 高考数学基本技能试题及答案
- 建筑工程项目的整体策划与实施试题及答案
评论
0/150
提交评论