BREW Applet框架 - 田海立的专栏 - CSDN博客
BREW Applet框架收藏
BREW Applet框架
The Framework of BREW Applet
2006-5-6
摘要
本文首先通过一个简单的Applet介绍BREW环境下Appl et的运行环境,然后分析如何在一个Module中实现多个Ap plet的方法,以及BREW中分布在不同的Module中的各 个Applet之间的启动交互关系。
摘要... 1
1 BREW概览... 2
1.1 BREW简介... 2
1.2 BREW中的几个基本概念... 2
1.3 BREW模拟开发环境... 3
2 麻雀虽小,五脏俱全之HelloBREW.. 3
2.1 文件组成... 3
2.2 Module和Applet的总体框架... 4
2.3 实现HelloBREW.. 6
2.3.1 类型定义... 6
2.3.2 AEEClsCreateInstance()的实现... 6
2.3.3 HandleEvent()的实现... 7
2.3.4 加入事件处理代码... 8
2.4 HelloBREW的执行结果... 9
3 多个Applet实现在同一个Module里... 9
3.1 文件组成... 9
3.2 实现AppsInOneModule. 11
3.2.1 类型定义... 11
3.2.2 AEEClsCreateInstance() 函数的实现... 11
3.2.3 Applet构造函数的实现... 12
3.2.4 Applet事件处理... 12
3.3 执行序列... 13
4 Applet实现在不同的Module里... 14
总结... 16
参考资料及进一步参考... 16
关于作者... 17
1 BREW概览... 2
1.1 BREW简介... 2
1.2 BREW中的几个基本概念... 2
1.3 BREW模拟开发环境... 3
2 麻雀虽小,五脏俱全之HelloBREW.. 3
2.1 文件组成... 3
2.2 Module和Applet的总体框架... 4
2.3 实现HelloBREW.. 6
2.3.1 类型定义... 6
2.3.2 AEEClsCreateInstance()的实现... 6
2.3.3 HandleEvent()的实现... 7
2.3.4 加入事件处理代码... 8
2.4 HelloBREW的执行结果... 9
3 多个Applet实现在同一个Module里... 9
3.1 文件组成... 9
3.2 实现AppsInOneModule. 11
3.2.1 类型定义... 11
3.2.2 AEEClsCreateInstance() 函数的实现... 11
3.2.3 Applet构造函数的实现... 12
3.2.4 Applet事件处理... 12
3.3 执行序列... 13
4 Applet实现在不同的Module里... 14
总结... 16
参考资料及进一步参考... 16
关于作者... 17
1 BREW概览
1.1 BREW简介
BREW(Binary Runtime Environment for Wireless,即无线二进制运行环境)是QUALCOMM 公司的产品。它以组件(COM) 的组织形式封装了底层平台提供给应用开发的服务, 屏蔽了底层的实现细节,而提供给应用层统一的API。它所提供的 API描述的是Spec而非实现细节,不管今后QUALCOMM 的平台技术如何发展,其实现的功能和实现该功能的API规范应该 是确定并向后兼容的。
BREW上接受的OEM或其他第三方软件厂商提供的最终软件实体 是Module的执行体——Win32模拟环境下是 *.dll,真实机器上是*.mod,这也体现了BREW中的Binary。另外, 也可以在BREW运行时从网络上下载BREW所接受的实体, 加入到BREW中来运行。
1.2 BREW中的几个基本概念
BREW中的有Applet和Extension,Applet 是一个独立运行(从应用开发角度看)的实体,有Applet Context,简记为ACONTEXT;Extension通 过实现它所定义的接口提供服务给Applet或其它Extens ion,Extension不是独立的运行实体, 它运行在调用它的Applet(直接或间接地,当前Extens ion Ext1的某个服务Ext1::srv可能不是由Applet直 接调用,但是调用Ext1::srv的Extension Ext2归根到底还是可以追溯到某个Applet)的ACONT EXT中。Applet和Extension都是被包含在Mod ule里面的,它们之间的关系如图一所示。
图一、BREW中几个概念之间的关系
BREW最终接受的是Module,所以你所提供的Applet 和Extension必须在某个Module中;另一方面,一个 Module里可以有0…n个Applet或Extension ,也可以同时有Applet和Extension, 还可以两者都没有,不过两者都没有的Module也没有实际意义 。Module的属性和它所包含的Applet和Extensi on的信息,以及Dependency关系都描述在MIF(Mo dule Information File)文件里,BREW通过该描述文件检索它所需要的信息, 并通过相应的Module二进制文件完成相应的操作。
BREW加载Applet或Extension时, 首先检查包含它的Module是否已经被加载到内存里, 如果还没在内存里,BREW要做的工作是先把该Module加载 ;接着BREW通过该Module的IMODULE_ CreateInstance() 来创建Applet或Extension的一个实例,然后才完成 Applet或Extension的真正加载。
1.3 BREW模拟开发环境
本文所描述的BREW环境和概念都是基于BREW 3.0.1,采用的程序在下面软件环境中调试通过:
BREW SDK 3.0.1,包含
API手册
BREW Simulator, MIF Editor, etc.
Header files & some src files
API手册
BREW Simulator, MIF Editor, etc.
Header files & some src files
Microsoft Visual studio,包含
Visual studio 6.0
Visual studio 6.0 Service Package 5
Visual studio 6.0
Visual studio 6.0 Service Package 5
Additions
BREW Application Wizard
BREW Addins for vs60
BREW Application Wizard
BREW Addins for vs60
2 麻雀虽小,五脏俱全之HelloBREW
有了上面BREW的概念以及开发调试所需的软件环境, 下面我们看一个简单的BREW Applet——HelloBREW。
2.1 文件组成
在ms vs60环境中通过BREW Application Wizard创建一个HelloBREW 工程。自动生成和关联的文件如图二所示。
图二、HelloBREW中自动生成的文件
AEEAppGen.c和AEEModGen.c是BREW SDK中自代的文件,分别是IApplet和IModule的一 个实现。HelloBREW.c是新生成的文件,利用了AEEA pplet这一Applet实现模版来实现特定的Applet。
这些文件将连同BREW SDK提供库一块被编译并连接成一个dll文件——HelloB REW.dll(WIN32环境中,Module的执行体)。 但是,只是有这些还不行,还没有跟BREW的Module及Ap plet关联起来,BREW Simulator也不会知道如何创建和加载它们。 我们还必须创建一个MIF文件来描述这些信息。
假定,我们创建的HelloBREW这个Applet包含在He lloBREW Module中。那么,我们用BREW MIF Editor创建一个HelloBREW.mif文件; 然后在其中创建一个Applet HelloBREW,并把这个Applet的AEECLSID描 述文件HelloBREW.bid保存;最后通过菜单Build Compile MIF Script来编译这个MIF脚本,保存退出。用BREW MIF Editor创建HelloBREW.mif的过程如图三所示。
图三、编辑HelloBREW.MIF
上面工作做完之后,vs60的工程就可被Build成一个BRE W的Module执行体,并可用BREW Simulator来装载执行。但是,现在这个Module的A pplet什么工作也没做,执行起来也没什么意义, 笔者打算在分析Applet框架并加入一些处理代码之后, 再来执行之。
2.2 Module和Applet的总体框架
通过调试跟踪上述的HelloBREW 工程,得出图四所示的BREW的 Module和Applet的执行序列。
图四、BREW中Module和Applet演示——Hello BREW
AEEModGen、AEEAppGen和HelloBREW 一起被编译并连接为 HelloBREW.dll。如1.2节所述,BREW 刚启动时并不是加载所有的Module,只有在 Module 所包含的 Applet 或 Extension 需要被加载时,BREW才加载该Module。所以, 当用户点击执行HelloBREW 这个Applet 时,BREW 通过调用 AEEMod_Load() 首先来加载这个 Module [序列1];AEEModGen 通过 AEEStaticMod_New() 完成IModule 创建和初始化的工作之后,Module的加载过程完成[序列2& 3]。
Module被加载完成之后,BREW就通过 IMODULE_CreateInstance() 来创建Applet,AEEModGen通过HelloBREW 的AEEClsCreateInstance(),把Apple t的具体创建工作交给HelloBREW [序列4, 5 & 6];而AEEAppGen通过AEEApplet_New() 提供了IApplet创建和初始化的便利,HelloBREW通 过在AEEClsCreateInstance()中调用此函数 ,把具体的事件处理函数HelloBREW_ HandleEvent() 和程序退出时的清理函数注册到BREW里。当完成上述工作并返回 AEE_SUCCESS之后, Applet的创建也就完成了 [序列 4~8]。
如果Applet是因为要运行而被创建并成功创建之后, 会马上收到一条EVT_APP_START的事件,此时你的Ap plet已经正常的加载运行了,并通过HandleEvent函 数来处理它所收到的各种事件。
再把上述过程总结一下,AEEAppGen和AEEModGen 其实并不是独立的实体对象,只是由于它们是BREW SDK提供的,为了明确展现开发BREW Applet时,程序员自己所要做的工作的需要, 才把它们单独列出来。要看程序员所需要做的工作,只需要从图四中 HelloBREW的生命线(竖线)看过去,也就是只要实现AE EClsCreateInstance(),另外,HelloB REW调用AEEApplet_New() 时,把注册自己实现的事件处理函数和程序退出时的清理函数, 而退出时的清理函数也可以不定义,所以最后, 程序员所要实现的函数只有AEEClsCreateInstan ce()和事件处理函数。
2.3 实现HelloBREW
2.3.1 类型定义
首先,定义一个结构体,里面可以存放用户关心的数据。
typedef struct _HelloBREW {
AEEApplet a; // Must be AEEApplet
AEEDeviceInfo DeviceInfo; // access to the HW device info
IDisplay *pIDisplay; // access the Display interface
IShell *pIShell; // access the Shell interface
} HelloBREW;
AEEApplet a; // Must be AEEApplet
AEEDeviceInfo DeviceInfo; // access to the HW device info
IDisplay *pIDisplay; // access the Display interface
IShell *pIShell; // access the Shell interface
} HelloBREW;
代码片断一、HelloBREW类型的定义
2.3.2 AEEClsCreateInstance()的实现
int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *po, void **ppObj) {
*ppObj = NULL;
if (ClsId == AEECLSID_HELLOBREW) {
// Create the applet and make room for the applet structure
if (AEEApplet_New(sizeof(HelloBRE W), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER)HelloBREW_ HandleEvent, (PFNFREEAPPDATA)HelloBREW_ FreeAppData)) {
if (HelloBREW_InitAppData((HelloB REW*)*ppObj)) {
// Data initialized successfully
return (AEE_SUCCESS); }
else
{
IAPPLET_Release((IApplet*)*ppO bj); return EFAILED; }
} // end AEEApplet_New
}
return (EFAILED); }
*ppObj = NULL;
if (ClsId == AEECLSID_HELLOBREW) {
// Create the applet and make room for the applet structure
if (AEEApplet_New(sizeof(HelloBRE
if (HelloBREW_InitAppData((HelloB
// Data initialized successfully
return (AEE_SUCCESS); }
else
{
IAPPLET_Release((IApplet*)*ppO
} // end AEEApplet_New
}
return (EFAILED); }
代码片断二、HelloBREW 中 AEEClsCreateInstance() 的实现
这里定义了一个局部的初始化函数HelloBREW_ InitAppData(),用来执行用户数据的初始化,比如, 把初始化HelloBREW的下列成员DeviceInfo : AEEDeviceInfo; *pIDisplay: IDisplay; *pIShell: IShell。
2.3.3 HandleEvent()的实现
最后看,HelloBREW的主体——事件处理函数HelloB REW_HandleEvent()
原型为:
boolean HelloBREW_HandleEvent( HelloBREW* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
该函数通过eCode参数来决定消息的类型, 然后做出相应的处理,所以它的主体是一个大的switch语句:
switch (eCode) {
// App is told it is starting up
case EVT_APP_START: return (TRUE);
// App is told it is exiting
case EVT_APP_STOP: return (TRUE);
// App is being suspended
case EVT_APP_SUSPEND: return (TRUE);
// App is being resumed
case EVT_APP_RESUME: return (TRUE);
case EVT_APP_MESSAGE: return (TRUE);
case EVT_KEY: return (TRUE);
// If nothing fits up to this point then we'll just break out
default: break; }
return FALSE;
// App is told it is starting up
case EVT_APP_START: return (TRUE);
// App is told it is exiting
case EVT_APP_STOP: return (TRUE);
// App is being suspended
case EVT_APP_SUSPEND: return (TRUE);
// App is being resumed
case EVT_APP_RESUME: return (TRUE);
case EVT_APP_MESSAGE: return (TRUE);
case EVT_KEY: return (TRUE);
// If nothing fits up to this point then we'll just break out
default: break; }
return FALSE;
代码片断三、HelloBREW 中事件处理的主体实现
如果事件被处理,该函数返回TRUE,否则返回FALSE。
2.3.4 加入事件处理代码
为了简单起见,笔者就直接在HelloBREW刚被加载也就是在 收到EVT_APP_START事件的时候加入一些处理。 对这个事件的处理也只是显示“Hello BREW”。相应的代码如下:
AECHAR szText[] = L"Hello BREW";
switch (eCode)
{
// App is told it is starting up
case EVT_APP_START: ...
switch (eCode)
{
// App is told it is starting up
case EVT_APP_START: ...
Things you can do from here:
- Subscribe to blog.csdn.net using Google Reader
- Get started using Google Reader to easily keep up with all your favorite sites
沒有留言:
張貼留言