c写安卓程序
Ⅰ 如何用c++写安卓手机软件
用c++写安卓手机软件的方法:
安装ndk,使用纯c++开发安卓程序,下边是详细的步骤与说明:
1、编写入口函数
android_main为入口函数,和C++中的main函数是一样的。这里创建CELLAndroidApp的对象,直接调用main函数。
voidandroid_main(structandroid_app*state)
{
CELLAndroidAppapp(state);
app.main(0,0);
}
2.绘制类的实现说明
protected:
EGLConfig_config;
EGLSurface_surface;
EGLContext_context;
EGLDisplay_display;
android_app*_app;
int_width;
int_height;
部分参数说明:
_surface:用于绘制图形,相当于windows绘图中的位图
_context:可以看做是opengl对象
_display:用于绘图的设备上下文,类似于windows绘图中的dc
3.构造函数说明
CELLAndroidApp(android_app*app):_app(app) { _surface=0; _context=0; _display=0; _width=64; _height=48; app->userData=this;//用户数据 app->onAppCmd=handle_cmd;//窗口的创建销毁等 app->onInputEvent=handle_input;//回调函数 }
值得注意的是,这里的app中的userData,传入用户数据,这里直接传入this,onAppCmd传入的handle_cmd回调函数,onInputEvent传入的事handle_input回调函数
4.类中函数main()说明
virtualvoidmain(intargc,char**argv)
{
intident;
intevents;
android_poll_source*source;
while(true)
{
while((ident=ALooper_pollAll(0,NULL,&events,(void**)&source))>=0)
{
if(source!=NULL)
source->process(_app,source);//有触摸事件,调用input函数,相当于dispatchmessage
if(_app->destroyRequested!=0)
return;
}
render();
}
}
5.调用render()函数,绘制图形。
6.初始化设备函数initDevice()
virtualvoidinitDevice()
{
constEGLintattribs[]=
{
EGL_SURFACE_TYPE,EGL_WINDOW_BIT,
EGL_BLUE_SIZE,8,
EGL_GREEN_SIZE,8,
EGL_RED_SIZE,8,
EGL_NONE
};
EGLintformat;
EGLintnumConfigs;
_display=eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(_display,0,0);
eglChooseConfig(_display,attribs,&_config,1,&numConfigs);
eglGetConfigAttrib(_display,_config,EGL_NATIVE_VISUAL_ID,&format);
ANativeWindow_setBuffersGeometry(_app->window,0,0,format);
_surface=eglCreateWindowSurface(_display,_config,_app->window,NULL);
#if0
EGLintcontextAtt[]={EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE,EGL_NONE};
_context=eglCreateContext(_display,_config,0,contextAtt);
#else
_context=eglCreateContext(_display,_config,0,0);
#endif
if(eglMakeCurrent(_display,_surface,_surface,_context)==EGL_FALSE)
{
LOGW("UnabletoeglMakeCurrent");
return;
}
eglQuerySurface(_display,_surface,EGL_WIDTH,&_width);
eglQuerySurface(_display,_surface,EGL_HEIGHT,&_height);
onCreate();
//InitializeGLstate.
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_FASTEST);
glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
glDisable(GL_DEPTH_TEST);
glViewport(0,0,_width,_height);
glOrthof(0,_width,_height,0,-100,100);
7.绘制函数render()
virtualvoidrender()
{
if(_display==0)
{
return;
}
glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
if(g_arVertex.size()>=2)
{
glColor4f(1,1,1,1);
glVertexPointer(3,GL_FLOAT,0,&g_arVertex[0]);
glDrawArrays(GL_LINE_STRIP,0,g_arVertex.size());
}
eglSwapBuffers(_display,_surface);//双缓存的交换缓冲区
}
8.编译程序,将程序导入到模拟器中,最终运行的效果图如下: