如何用纯C(ndk)开发安卓应用.docx_第1页
如何用纯C(ndk)开发安卓应用.docx_第2页
如何用纯C(ndk)开发安卓应用.docx_第3页
如何用纯C(ndk)开发安卓应用.docx_第4页
如何用纯C(ndk)开发安卓应用.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何用 纯C+(ndk)开发安卓应用 ?2014-06-04 13:19 佚名 OpenG 字号:T | T如何安装安卓的开发环境以及怎么设置ndk的环境变量等在前边的文章已经有了详细的讲解,在这里我就不再说明,如果有不会安装和设置环境的,请先参考安卓环境搭建的内容。AD: WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统 51CTO主办WOT全球软件技术峰会直减百元优惠活动 抢票进行中! 如何安装安卓的开发环境以及怎么设置ndk的环境变量等在前边的文章已经有了详细的讲解,在这里我就不再说明,如果有不会安装和设置环境的,请先参考安卓环境搭建的内容。好,假设以及安装好了ndk,使用纯c+开发安卓程序,下边是详细的步骤与说明:1.编写入口函数android_main为入口函数,和C+中的main函数是一样的。这里创建CELLAndroidApp的对象,直接调用main函数。1. voidandroid_main(structandroid_app*state) 2. 3. CELLAndroidAppapp(state); 4. 5. app.main(0,0); 6. 说明:其中的CELLAndroidApp是我们设计的一个图形绘制类,稍后将对其做详细说明2.绘制类的实现说明2.1类的成员说明1. protected: 2. EGLConfig_config; 3. EGLSurface_surface; 4. EGLContext_context; 5. EGLDisplay_display; 6. android_app*_app; 7. int_width; 8. int_height;部分参数说明:_surface:用于绘制图形,相当于windows绘图中的位图_context:可以看做是opengl对象_display:用于绘图的设备上下文,类似于windows绘图中的dc2.2 构造函数说明1. CELLAndroidApp(android_app*app):_app(app) 2. 3. _surface=0; 4. _context=0; 5. _display=0; 6. _width=64; 7. _height=48; 8. app-userData=this;/用户数据 9. app-onAppCmd=handle_cmd;/窗口的创建销毁等 10. app-onInputEvent=handle_input;/回调函数 11. 值得注意的是,这里的app中的userData,传入用户数据,这里直接传入this,onAppCmd传入的handle_cmd回调函数,onInputEvent传入的事handle_input回调函数2.3 类中函数main()说明1. virtualvoidmain(intargc,char*argv) 2. 3. intident; 4. intevents; 5. android_poll_source*source; 6. 7. while(true) 8. 9. while(ident=ALooper_pollAll(0,NULL,&events,(void*)&source)=0) 10. 11. if(source!=NULL) 12. source-process(_app,source);/有触摸事件,调用input函数,相当于dispatchmessage 13. 14. if(_app-destroyRequested!=0) 15. return; 16. 17. render(); 18. 19. 其中的android_poll_source相当于windows中的消息队列,用于存放消息,这个函数中模拟了windows中的消息机制。ALooper_pollAll()函数,用于获取消息。值得注意的是第一个参数,如果第一个参数传入0,则不等待,调用后直接返回,类似于windows消息机制中的pickMessage()函数,如果传入-1,则类似于windows消息机制中的SendMessage()函数。 返回值:如果返回值大于大于等于0表示获取到数据,如果为-1则表示失败,未获取到数据。其中发source如果不为空,则表示有触摸事件,则调用process()函数,相当于windows中调用dispatchMessage()函数。最后,调用render()函数,绘制图形。2.4 初始化设备函数initDevice()1. virtualvoidinitDevice() 2. 3. constEGLintattribs= 4. 5. EGL_SURFACE_TYPE,EGL_WINDOW_BIT, 6. EGL_BLUE_SIZE,8, 7. EGL_GREEN_SIZE,8, 8. EGL_RED_SIZE,8, 9. EGL_NONE 10. ; 11. EGLintformat; 12. EGLintnumConfigs; 13. 14. _display=eglGetDisplay(EGL_DEFAULT_DISPLAY); 15. 16. eglInitialize(_display,0,0); 17. 18. eglChooseConfig(_display,attribs,&_config,1,&numConfigs); 19. 20. eglGetConfigAttrib(_display,_config,EGL_NATIVE_VISUAL_ID,&format); 21. 22. ANativeWindow_setBuffersGeometry(_app-window,0,0,format); 23. 24. _surface=eglCreateWindowSurface(_display,_config,_app-window,NULL); 25. 26. #if0 27. EGLintcontextAtt=EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE,EGL_NONE; 28. 29. _context=eglCreateContext(_display,_config,0,contextAtt); 30. #else 31. _context=eglCreateContext(_display,_config,0,0); 32. #endif 33. 34. if(eglMakeCurrent(_display,_surface,_surface,_context)=EGL_FALSE) 35. 36. LOGW(UnabletoeglMakeCurrent); 37. return; 38. 39. 40. eglQuerySurface(_display,_surface,EGL_WIDTH,&_width); 41. eglQuerySurface(_display,_surface,EGL_HEIGHT,&_height); 42. 43. onCreate(); 44. 45. /InitializeGLstate. 46. glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_FASTEST); 47. glEnable(GL_CULL_FACE); 48. glShadeModel(GL_SMOOTH); 49. glDisable(GL_DEPTH_TEST); 50. glViewport(0,0,_width,_height); 51. glOrthof(0,_width,_height,0,-100,100); 52. 首先需要说明的是attribs数组,改数组中主要存储了绘制图形的一些属性信息,他们是成对出现的,如EGL_SURFACE_TYPE则表示绘制图形类型,EGL_WINDOW_BIT则表示绘制到窗口上。eglGetDisplay()函数:表示获取一个显示设备eglInitialize():表示初始化获取到的显示设备eglChooseConfig():绘制属性的配置eglGetConfigAttrib():设置绘制格式ANativeWindow_setBuffersGeometry():将格式应用到窗口eglCreateWindowSurface():创建绘图窗口eglCreateContext():创建opengl的绘图上下文eglMakeCurrent():绑定到绘图设备上下文eglQuerySurface():获取图片的宽度和高度,具体获取哪一个根据最后一个参数确定glHint()、glEnable()和glOrthof()等函数则是与绘图的投影相关的内容,包括初始化、设置模式等内容。2.5 绘制函数render()1. virtualvoidrender() 2. 3. if(_display=0) 4. 5. return; 6. 7. glClearColor(0,0,0,1); 8. glClear(GL_COLOR_BUFFER_BIT); 9. 10. glEnableClientState(GL_VERTEX_ARRAY); 11. if(g_arVertex.size()=2) 12. 13. glColor4f(1,1,1,1); 14. glVertexPointer(3,GL_FLOAT,0,&g_arVertex0); 15. glDrawArrays(GL_LINE_STRIP,0,g_arVertex.size(); 16. 17. 18. eglSwapBuffers(_display,_surface);/双缓存的交换缓冲区 19. render()函数主要用于绘制点,对主要的几个函数做如下说明:glClearColor():用于将屏幕清为黑色glClear():清空颜色缓冲区glEnableClientState():启动定点数组glVertexPointer():制定定点缓冲区glDrawArrays():绘制点数组eglSwapBuffers():类似双缓存的交换缓冲区2.6handle_cmd()函数1. staticvoidhandle_cmd(android_app*app,int32_tcmd) 2. 3. CELLAndroidApp*pThis=(CELLAndroidApp*)app-userData; 4. pThis-cmd(app,cmd); 5. 2.7handle_input()函数1. staticvoidhandle_input(android_app*app,AInputEvent*event) 2. 3. CELLAndroidApp*pThis=(CELLAndroidApp*)app-userData; 4. pThis-input(app,event); 5. 2.8input()函数1. virtualintinput(structandroid_app*app,AInputEvent*event) 2. 3. int32_tevtType=AInputEvent_getType(event); 4. switch(evtType) 5. 6. caseAINPUT_EVENT_TYPE_KEY: 7. break; 8. caseAINPUT_EVENT_TYPE_MOTION: 9. 10. int32_tsourceId=AInputEvent_getSource(event); 11. if(AINPUT_SOURCE_TOUCHSCREEN=sourceId) 12. 13. int32_tid=AMotionEvent_getAction(event); 14. switch(id) 15. 16. caseAMOTION_EVENT_ACTION_MOVE: 17. 18. size_tcnt=AMotionEvent_getPointerCount(event); 19. for(inti=0;icnt;+i) 20. 21. floatx=AMotionEvent_getX(event,i); 22. floaty=AMotionEvent_getY(event,i); 23. float3pt; 24. pt.x=x; 25. pt.y=y; 26. pt.z=0; 27. g_arVertex.push_back(pt); 28. 29. 30. 31. break; 32. caseAMOTION_EVENT_ACTION_DOWN: 33. 34. size_tcnt=AMotionEvent_getPointerCount(event); 35. for(inti=0;icnt;+i) 36. 37. floatx=AMotionEvent_getX(event,i); 38. floaty=AMotionEvent_getY(event,i); 39. 40. 41. break; 42. caseAMOTION_EVENT_ACTION_UP: 43. 44. size_tcnt=AMotionEvent_getPointerCount(event); 45. for(inti=0;icnt;+i) 46. 47. floatx=AMotionEvent_getX(event,i); 48. floaty=AMotionEvent_getY(event,i); 49. 50. 51. break; 52. 53. 54. elseif(AINPUT_SOURCE_TRACKBALL=sourceId) 55. 56. 57. 58. break; 59. 60. return0; 61. 该函数主要用于对输入进行判断,以确定是吉键盘、鼠标或遥感等,根据具体输入做相应的操纵,这里就不再做过多的说明AMotionEvent_getPointerCount():如果是多点触控,则将各个点保存到vector中。2.9 cmd()函数1. virtualintcmd(structandroid_app*app,int32_tcmd) 2. 3. switch(cmd) 4. 5. caseAPP_CMD_SAVE_STATE: 6. break; 7. caseAPP_CMD_INIT_WINDOW: 8. initDevice(); 9. break; 10. caseAPP_CMD_TERM_WINDOW: 11. shutDownDevice(); 12. break; 13. caseAPP_CMD_GAINED_FOCUS: 14. break; 15. caseAPP_CMD_LOST_FOCUS: 16. break; 17. 18. return0; 19. 根据传入的命令,对窗口做相应的处理。APP_CMD_INIT_WINDOW:表示初始化窗口2.10shutDownDevice()函数1. virtualvoidshutDownDevice

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论