📄 《深入brew开发》——第七章 创建新的brew应用程序 - gemsea的专栏 - csdnblog.htm
字号:
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>避免堆栈溢出</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>由于系统分配给BREW运行环境的堆栈空间是有限的,因此不要在堆栈中分配大数组,也就是说,不要再一个函数的局部变量中声明大数组。如果确实在程序中需要这样的数组,那么,请使用分配内存的方式。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>不要使用大的循环</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>当一个循环运行的时间足够长时,将引起BREW设备的复位。基于这样的原因,不能在一个BREW事件里进行耗时很长的处理。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>尽可能的使应用程序成为设备独立的</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>为了使我们的应用程序可以独立于设备的内存大小、键盘数量、颜色深度和屏幕尺寸等因素而独立运行,请使用ISHELL_GetDeviceInfo()方法来获得设备的规格,从而根据不同的规格处理不同的应用程序。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>使用资源文件</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>使用资源文件存储指定语言的字符串、对话框和图片。这样可以方便的进行不同语言版本的开发,而不影响代码本身。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>释放内存</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>由于在BREW设备上的可用内存是有限的,因此清理不使用的内存就十分重要了。有如下两种情况:</DIV>
<DIV>1、必须释放全部创建的实例</DIV>
<DIV>2、应用程序终止时必须释放全部分配的内存</DIV>
<DIV>推荐在内存不再使用的时候就释放掉。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>不要使用全局或静态变量</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>由于全局和局部变量在BREW动态应用程序中无法处理,因此基于这样的BREW架构不支持全局和静态变量,而且全局和静态变量也会引起BREW设备环境下的链接错误。请在应用程序的结构体中声明这些数据。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>不要在定义的时候初始化一个结构体</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>与上面不能使用全局和静态变量一样,在定义的时候初始化一个结构体也会引起BREW设备环境下的一个链接错误。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>不要直接使用C语言的浮点运算</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>BREW平台不支持浮点运算。虽然这些运算在模拟器中运行良好,那时因为在Windows环境下,在BREW设备环境下,通常不支持浮点运算。如果确实需要使用的话,请用BREW提供的助手函数进行运算。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>使用BREW支持的标准库函数</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>为了可以让我们的程序所占的空间最小,请不要使用目标设备的库函数,而是使用BREW提供相应的助手函数。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>避免类型转换错误</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>由于目标设备的编译器对于类型的检查要严格,因此,请明确声明变量转换的类型,以防止从Windows环境移植到BREW设备环境下产生错误。</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=151>
<DIV>检查返回值</DIV></TD>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 312.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=417>
<DIV>如果我们调用的BREW
API含有返回值,建议处理这些返回值,这样可以让我们所写的程序更加健壮。</DIV></TD></TR></TBODY></TABLE>
<DIV><STRONG><FONT size=4><A name=_Toc122440715><SPAN>7.2
</SPAN></A><SPAN><SPAN>创建一个BREW</SPAN></SPAN><SPAN><SPAN>应用程序</SPAN></SPAN></FONT></STRONG></DIV>
<DIV><SPAN>
</SPAN>在这一节里,我们将首先建立一个叫做HelloWorld的应用程序,然后分析这个程序当中的各个要素。也正是从这个例子开始,将正式的带您进入BREW的开发世界。在这本书里,我们使用的环境是Visual
Studio .Net开发环境,当然我们也可以使用Visual Studio6.0来创建,并且他们之间看上去没什么太多的不同。</DIV>
<DIV><STRONG><FONT
size=3><SPAN><SPAN>7.2.1</SPAN></SPAN><SPAN><SPAN>建立应用程序</SPAN></SPAN></FONT></STRONG></DIV>
<DIV><SPAN>
</SPAN>可以采用如下的步骤建立HelloWorld应用程序:</DIV>
<DIV><SPAN>
1</SPAN>、我们可以到高通公司的网站上去获取一个名叫HelloWorld的应用程序的Class
ID,如果您还没有成为一个授权的BREW应用程序开发者,那么您可以将BREW
SDK样例程序HelloWorld中的HelloWorld.bid复制过来。</DIV>
<DIV><SPAN>
2</SPAN>、使用画图工具或者其他的图片编辑工具为这个应用程序创建图标。图像分为大、中、小三种,我们可以指定bmp、png、bci或jpg图片,图片的大小没有特殊的要求,我们只需要根据您的喜好选定就可以了。不过当程序运行在设备上时,不同的设备由不同的要求,您可以查看该设备的规格说明。</DIV>
<DIV><SPAN> 3</SPAN>、打开Visual
Studio2003。</DIV>
<DIV><SPAN>
4</SPAN>、打开BREW应用程序向导。通过选择文件->新建->项目菜单,打开创建项目对话框,选择Visual
C++项目下的BREWAppWizard项目。在对话框的下部输入应用程序名和应用程序存储路径。点击确定按钮,此时BREW的应用程序向导启动。</DIV>
<DIV><SPAN>
5</SPAN>、由于我们的应用程序仅需要刷新屏幕,因此保留全部的设置直接点击完成。</DIV>
<DIV><SPAN>
6</SPAN>、载入MIF文件编辑器,为应用程序创建MIF文件。</DIV>
<DIV
style="TEXT-INDENT: 21pt">7、在MIF文件编辑器的Applets选项卡中,新建Applet,并选择我们已经获取的helloworld.bid文件作为次应用程序的Class
ID。</DIV>
<DIV style="TEXT-INDENT: 21pt">8、选择应用程序的类型为“Tools”。</DIV>
<DIV style="TEXT-INDENT: 21pt">9、设置我们在第二步创建的三个图标做为应用程序的图标。</DIV>
<DIV
style="TEXT-INDENT: 21pt">10、保存文件为helloworld.mfx文件,同时选择“Build->Compile
MIF
Script”菜单或者按“F5<SPAN><SPAN>”</SPAN>键,编译<SPAN>二进制文件。由于此命令输出的文件名采用的是</SPAN>DOS</SPAN>短文件名方式,因此请手动修改文件名。</DIV>
<DIV style="TEXT-INDENT: 21pt">11、关闭MIF文件编辑器,返回Visual Studio界面。</DIV>
<DIV
style="TEXT-INDENT: 21pt">12、在“项目->helloworld项目属性”对话框的常规选项中,将输出目录置为空,以便于生成的DLL文件可以在根目录中生成。</DIV>
<DIV
style="TEXT-INDENT: 21pt">13、在“解决方案资源管理器”中,打开helloworld.c文件。同时输入如下内容:</DIV>
<TABLE
style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse"
cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #ffcc99; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=568>
<DIV>helloworld.c</DIV></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid"
vAlign=top width=568>
<DIV>/*====================================================================</DIV>
<DIV>FILE: helloworld.c</DIV>
<DIV>====================================================================*/</DIV>
<DIV> </DIV>
<DIV>/*====================================================================</DIV>
<DIV>INCLUDES AND VARIABLE DEFINITIONS</DIV>
<DIV>====================================================================*/</DIV>
<DIV>#include
"AEEModGen.h"<SPAN>
// Module interface definitions</SPAN></DIV>
<DIV>#include
"AEEAppGen.h"<SPAN>
// Applet interface definitions</SPAN></DIV>
<DIV>#include
"AEEShell.h"<SPAN>
// Shell interface definitions</SPAN></DIV>
<DIV> </DIV>
<DIV>#include "helloworld.bid"</DIV>
<DIV> </DIV>
<DIV>/*-------------------------------------------------------------------</DIV>
<DIV>Applet structure. All variables in here are reference via
"pMe->"</DIV>
<DIV>-------------------------------------------------------------------*/</DIV>
<DIV>// create an applet structure that's passed around. All
variables in</DIV>
<DIV>// here will be able to be referenced as static.</DIV>
<DIV>typedef struct _helloworld {</DIV>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -