编写跨平台的手机软件 BY  劳永超 http://www.devdiv.net
编写跨平台的手机软件 总时间  –  20-30min 谈一谈编写跨平台软件的可能性 Q&A – 5-10min fluke @ DevDiv http://www.devdiv.net
现状 手机平台百花齐放 系统默认开发语言不一样 开发环境不一样 Symbian/WM/Android/iPhone/Meego/PalmPre/Win7/Bada ( 未考虑非智能手机 ) 硬件不一样 http://www.devdiv.net
环境分类 C/C++ : Symbian/WindowsMobile Java: Android/Symbian(android 一定程度上可以用 j2m e 的库 ) Flash/Web/HTML5:  看起来美好,但标准不统一,可以使用 web/flash 开发加上各平台的 webview 控件或者直接基于浏览器。 ( JIL 是一个 web 开发的标准,目前 Ophone/Limo 支持,和 Nokia Widget 有移植的可能性,貌似也有官方的移植工具) Qt/Qte/Gtk : Linux 类手机使用比较多,但现在只有 Qt 势头比较大。 http://www.devdiv.net
软件分类 资讯、内容(天气、新闻、视频、音频等,主打有版权的内容) 工具类(用于处理内容,像浏览器、播放器、照相、录音等,可能还对某类硬件、传感器依赖大) 游戏类(声音、视频输出性能要求高,逻辑复杂) http://www.devdiv.net
选择合适的方法 内容类主要从服务器获取内容,可以考虑使用系统标准的浏览器、播放器、查看器。其次可以考虑自己做 web 展现(用 flash 或者 js 比较能够满足相对复杂的逻辑) 工具类软件不同于内容类,多数逻辑在本地,纯逻辑部分想在源码级别跨平台,考虑使用标准 c/c++(iphone/android/wm/symbian/webos 都支持 ) ,或者标准 java( 在 j2me 和 android 之间可用 jar) http://www.devdiv.net
选择合适的方法 游戏类软件,考虑使用标准的图形处理 API(OpenGL) ,还可能获取硬件加速支持。 标准的媒体处理 API- OpenMax ,可能获得硬件加速支持(目前支持的芯片好像还不多,但应该是趋势) http://www.devdiv.net
标准硬件 API OpenGL( 移动设备上面的 DirectX):  跨语言的 2 D/3D 图形处理 API ,有硬件实现。 OpenMax( 移动设备上的多媒体框架 ):   对于应用开发来说 AL 和 IL 应该重点关注,前者有应用层的调用接口,后者提供了声音、视频、图像数据流处理、渲染的功能,也支持插件组件 ( 看起来像 DirectShow) 。 http://www.devdiv.net
O penMax http://www.khronos.org/openmax/ android 源码 \external\opencore\doc  (openCORE 使用了 IL) http://elinux.org/images/e/e0/The_OpenMAX_Integration_Layer_standard.pdf http://www.devdiv.net
系统 API 封装 系统 API 标准不一,有的一样,有的不一样。 不一样的: UI 、文件操作( Symbian, POSIX,WINDOWS )、 Socket(Symbian,POSIX,windows) 、拨号(各不一样)、多媒体 (MMF,opencore,VFW,DS) 、系统信息(各不一样)…… 可能一样的 :Linux/windows/symbian 都有 POSIX c 库。 考虑把 API 封装成多数系统支持的形式。 http://www.devdiv.net
总结 内容类软件推荐用 web/flash 开发,体验好,开发快速,客户端源码保密也不是重点关注点(个人认为是趋势之一)。但跨平台还很困难,除非 JIL.. 大型软件分离引擎 / 界面。引擎源码级别跨平台,封装平台公用组件(一般比较复杂,尤其是和硬件相关的接口),界面一般不重用 ( 一般不难 ) 。 硬件也有标准接口。 没有标准的时候,就看自己的抽象能力以及封装的必要性了。 http://www.devdiv.net
举个例子 开发一个跨 WM/Symbian/Android/iphone 平台的 工具 软件: 1.  引擎和界面分离。三个平台分别编写界面 ( 体验差异较大 ) ,但公用引擎逻辑代码。 2.  系统 API 做封装,如获取 IMEI ,文件访问, socket 访问等。 因为这部分相对稳定 。 3.  一些具有跨平台潜质的公共模块的移植,比如 SQLite , TinyXML 等。 4.  引擎的调用方法,均可以做成动态库的形式。 http://www.devdiv.net
举个例子 - 附图 http://www.devdiv.net
致谢 &FAQ http://www.devdiv.net 该话题比较宽泛,欢迎交流实际经验。 [email_address] http://www.devdiv.net

编写跨平台的手机软件