AEE体系结构分析

来源:互联网 发布:网络运营商怎么关闭 编辑:程序博客网 时间:2024/05/14 01:02

节选自《深入BREW手机游戏开发》

AEE (Application Exection Environment)

Brew构建于手机基础平台(如ASIC)之上,为应用开发提供了一致的称为AEE 的程序运行环境。

AEE的环境基本组织单位是Module(模块), Module是BREW应用开发和部署的基本单位,在Module中包含两种元素。

Applet:BREW应用的基本执行单位, 因为BREW是单线程的,所以,不论一个Module里面有多少个Applet,同一时间只有一个Applet被激活。一个Applet 可以被另一个Applet启动,但在这种情况下,当前的Applet 被暂停,切换到另一个Applet。

Class:这里的Class和面向对象开发语言中的类有一定的区别,AEE中的Class是BREW可以复用的基本单位,而且Class的复用范围并不局限于其所在的 Module,而是整个AEE环境,也就是说,一个Module可以使用其他Module中的Class。Class 的访问点(即一组完成特定功能的API)被称为Interface(接口)。
首先BREW 所有的API 都以Class形式来组织,提供了二十多个包括显示,文件操作,地址簿访问等功能的Interface;同时,BREW容许应用开发者编写自己的Class。


AEECLSID机制

BREW中的每个类或小程序必须拥有一个唯一的ClassID,我们通过MIF编辑器来指定ClassID。后缀为MIF的文件包含支持的类,支持的小程序以及小程序标题。启动时,BREW会在 设备屏幕上列举MIF文件,并保存从MIF列举收集来的信息,以便在请求类时使用。AEE外壳获取这个ID,外壳随后将使用该ID来加载并管理小程序,因此小程序的ID必须唯一。

Interface ClassIDs

每个BREW公共接口都拥有一个可标识自身的唯一ID。这些ID全部被保留不供其他接口或小程序使用,applet可以通过ISHELL_CreateInstance工厂方法来创建某个类的实例。


MODULE 和 APPLET 的创建

Module 的创建
Module 分为两种: 静态和动态。 静态模块由手机生产商直接固化到软件中去并不可移除 ,而动态模块则是通过空中接口进行动态加载。具体到模块的创建过程,两者基本相似,唯一的区别是静态创建的模块必须显式地提供一个CreateInstance 方法给AEEStaticMod_New供创建用。
AEE环境首先通过AEEMod_Load函数调用AEEStaticMod_New函数

Applet 的创建和启动

AEE环境在且仅在下面两种情况下创建Applet的实例
1.响应ISHELL_StartApplet 函数以容许小程序启动。这种情况下将创建小程序,并立即发送
EVT_APP_START事件。通知小程序已经激活并绘制到屏幕。

2.响应注册的通知和警报。这种情况下将创建小程序并立即收到通知的特定事件。
Applet的创建过程如下:
AEE环境通过AEEMod_CreateInstance调用AEEClsCreateInstance,这是每一个BREW应用都必须实现的方法。随后,AEEApplet_New被调用,其中创建了AEEApplet 的实例(AEEApplet派生于IApplet),再将其通过AEEMod_ListAdd加入到当前模块维护的所有Applet列表中去。

调用过程
int AEEMod_Load(IShell *pIShell, void *ph, IModule **ppMod)     --->
  return AEEStaticMod_New(sizeof(AEEMod),pIShell,ph,ppMod,NULL,NULL);  

--->
static int AEEMod_CreateInstance(IModule *pIModule,IShell *pIShell,
                      AEECLSID ClsId,void **ppObj)
--->
    nErr = AEEClsCreateInstance(ClsId, pIShell, pIModule, ppObj);
--->
boolean AEEApplet_New(int16 nIn,
              AEECLSID clsID,
              IShell * pIShell,
              IModule * pIModule,
              IApplet **ppobj,
              AEEHANDLER pAppHandleEvent,
              PFNFREEAPPDATA pFreeAppData)
----> HandleEvent(AEEApplet * pApp, AEEEvent eCode, uint16 wParam, uint32 dwParam);

原创粉丝点击