C++跨平台手机开发的一点心得

来源:互联网 发布:知名网红淘宝店有哪些 编辑:程序博客网 时间:2024/05/17 02:11

 前一段做C++手机平台的开发,把之前的一点心得写一下。
因为手机平台最近发展比较快,平台比较多,同一种平台的版本之间兼容性也差,所以推出一款手机产品想要支持多个平台,需要投入大量的研发力量,对每个平台进行开发。而程序员要求对平台知识也比较熟悉,这对程序员要求比较高而且也不容易进行项目管理。如果一个小组比较缺人,别外一个小组项目完成人员比较闲,可平台不一样,想借过来一些人来开发都不行,估计还没等借过来的人熟悉平台项目都结束了。为了解决这个问题,有些有实力的公司都开发了自己的类库,对程序员屏蔽了平台相关的知识。而且这些类库设计时采用了优秀的设计模式,引入MVC、状态机等,程序员可以快速的进行软件开发,不同小组之间人员借调也比较方便了。但对于程序员来说,使用这种类库开发,无疑阻碍了对平台知识学习的进度,而且如果对于一个平台很熟悉的话,进行“裸”开发的程序的效率甚至更高,但公司人员走动是免不了的,会不断的有人走掉有人加进来,工程没有统一的编码管理并不方便管理。所以开发人员往往都想进行“祼”开发,而上面的经理要求必须用公司类库开发。
    前一段参与的项目,因为要体现平台特色,UI没有采用公司的类库开发,通过开发总结的几

条关于项目跨平台的知识。
1.不同平台的项目初始化有些不同,所以可以把项目的功能实现为动态连接库,每个平台都创建自己的工程,构造必要的元素,然后加载动态连接库。brew平台下的软件都是动态加载的,还支持extension,可以实现,winmobile是微软推出的,更不用说,android也可以通过JINI的方式加载。
2.抽象出不同平台通用逻辑,通过平台代码实现。这个有点不好表达,通过一个例子来说吧。像UI这一块,每个控件可以抽象出一个与平台无关的逻辑层,如TvButton,TvContainer,TvLabel,TvImage....这些代码完全与平台无关,项目的代码可以依赖与它们,而它们的具体实现都可以通过平台相关代码实现。如果在平台相关这一层,如控件的基类可以命名为Widget,每个平台的控件都会处理事件,所以抽象出来一个handleEvent函数,用来处理系统事件,但每个平台的消息处理函数都不同,如 winmobile平台下,在创建控件时可以设定它的回调函数为static LRESULT CALLBACK WndProc(),而在wndProc实现中,可以getWidget()->pWidget->HandleEvent(),把消息交给HandleEvent处理,HandleEvent同样可以再把消息抛给对应的TvWidget处理。 在Brew平台下,创建控件时,设定回调函数static bool Widget_HandleEvent(),在它的实现中与上面一样,把消息扔给HandleEvent处理,它甚至可以用同一个头文件,不同的平台用不同的cpp文件,如上面的例子的头文件部分如下:
//通用代码...
MyInt GetWidth(){ return m_nWidth; }
 
#ifdef __BrewPlat__
protected:
static bool Widget_HandleEvent(Widget * pWidget, AEEEvent eCode, uint16 wParam,

uint32 dwParam);
#endif //__BREW_CPL__

#ifdef __WMobilePlat__
protected:
static LRESULT CALLBACK WndProc(HWND hWnd,  UINT message, WPARAM wParam, LPARAM

lParam); // the call-back function of windonw
#endif

protected:
 PlatformImage m_Image;
//通用代码...

3.宏开关控制不同平台代码。与平台相关的代码通过宏开关控件,代码可以如下:
#ifdef __MAC__
....mac code...
#endif

#ifdef __brew__
...brew code...
#endif
如果代码是某一平台的,如是brew平台的,按上面的例子,在项目的工程属性Preprocessor的

Preprocessor Definitions中添加一个宏__brew__。