几乎所有的开发语言教程都是以”Hello,world”应用程序作为第一个例子。“Hello,world!”例子显示了BREW API最基本的使用方法。
注意:下面的示例代码仅仅是用来显示BREW API的基本用法,这个程序可能并不能通过TRUE BREW测试,这是因为这个示例程序并不完全。
1. #include “AEEAppGen.h” // Applet helper file |
2. #include “helloworld.bid” // Applet-specific header that |
3. // contains class ID |
4 |
5. static boolean HelloWorld_HandleEvent(AEEApplet * pme, AEEEvent |
6. eCode,uint16 wParam, uint32 dwParam); |
7 |
8. // Applet loading function |
9. int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * |
10. pMod,void ** ppObj) |
11. { |
12. *ppObj = NULL; |
13 |
14. if(AEEApplet_New( sizeof(AEEApplet), // Size of our private |
15. // class |
16. ClsId, // Our class ID |
17. pIShell, // Shell interface |
18. pMod, // Module instance |
19. (IApplet**)ppObj, // Return object |
20. (AEEHANDLER)HelloWorld_HandleEvent, // Our event handler |
21. NULL)) // No special “cleanup” function |
22. return(AEE_SUCCESS); |
23 |
24. return (EFAILED); |
25. } |
26 |
27. // The event handling function |
28. static boolean HelloWorld_HandleEvent(AEEApplet * pMe, AEEEvent eCode, |
29. uint16 wParam, uint32 dwParam) |
30. { |
31. AECHAR szText[] = {‘H’,'e’,'l’,'l’,'o’,’ ‘,’W',’o', ‘r’, ‘l’, ‘d’, |
32. ‘\0′}; |
33 |
34. switch (eCode){ |
35. case EVT_APP_START: |
36. IDISPLAY_DrawText(pMe->m_pIDisplay, // Display instance |
37. AEE_FONT_BOLD,// Use BOLD font |
38. szText, // Text – Normally comes from |
39. // resource |
40. -1, // -1 = Use full string length |
41. 0, // Ignored – IDF_ALIGN_CENTER |
42. 0, // Ignored – IDF_ALIGN_MIDDLE |
43. NULL, // No clipping |
44. IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); |
45. IDISPLAY_Update (pMe->m_pIDisplay); |
46 |
47. return(TRUE); |
48 |
49. case EVT_APP_STOP: |
50. return(TRUE); |
51 |
52. default: |
53. break; |
54. } |
55. return(FALSE); |
56. } |
上面的示例代码使用了BREW SDK提供的Applet桩代码文件(AEEAppGen.c和AEEModGen.c)。这个文件将和上面的代码一起编译和链接。这些桩代码提供了支持IModule和IApplet接口所必需服务接口,一般在所有的BREW应用开发时都必需包含这两个文件,这使得开发人员只需要简单的关注通过HandleEvent函数传给Applet事件的处理。开发都可以选择直接实现IModule和IApplet接口以满足实际需求。
在例子中,Applet在接收到EVT_APP_START事件之后显示”Hello,World!”,这个消息是在BREW启动Applet通过Applet的HandleEvent函数发给应用程序的。这个例子显示“Hello,World”并通知显示设备刷新屏幕。
如果熟悉Window SDK编程的话,上面的例子和Window SDK编程方法基本类似。也非常容易掌握BREW的开发方法。
对例子代码进行逐行说明下面:
行号 | 说明 |
1 | 前面两行为Hello,world应用所使用的头文件,AEEAppGen.h中定义了Applet函数。 |
2 | Helloworld.bid包含了Applet唯一的ClassID AEECLSID_HELLOWORLD.这个Class Id是通过高通公司接口注册过程得到的。 |
5-6 | 为Applet的事件处理函数HandleEvent的事先声明。 |
9-25 | 这几行代码是所有模块都必需提供的载入代码,相当于程序的入口点。Hello world应用是作为动态库DLL被模拟器调用的,这种模式是设备上亦是一样的。函数AEEClsCreateInstance()的作用是为AEEApplet结构创建一个实例,这个结构通过AEEApplet_New()函数来创建,并设定应用特定的事件处理函数。第一个参数为Applet 数据结构的大小,因为在这个应用中没有其它变量,所以直接使用了AEEApplet数据结构大小。可以参见其它例子来了解如果使用AEEApplet_New()。 |
28-56 | HelloWorld_HandleEvent()函数处理Applet收到的所有事件,主事件类型,子事件类型以及事件相关数据通过参数eCode,wParam,dwParam来传递。 34行的switch函数查看Applet收到主事件类型。 如果事件是EVT_APP_START,则Applet收到了启动消息。 IDISPLAY_DrawText()用于在屏幕中间显示字符串”Hello,world!”,标识IDF_ALIGN_CENTER 和IDF_ALIGN_MIDDLE用于在水平和垂直方向将字符串居中。 IDISPLAY_Update()用于刷新屏幕。 当用户按下设备上的”END”键时,Applet将收到EVT_APP_STOP事件。当Applet收到此事件时,需要做Applet相关的清除工作。比如保存文件,释放内存等。因为这个示例没有分配内存,所以没有特别的清除工作需要完成。所以可以忽略这个事件。 |