Symbian是以Nokai为首的各手机厂商合伙开发的一个操作系统,主要用于高端的智能手机。其开发语言为C++,可以使用Microsoft Visual C++ 6.0作为集成化的开发环境,看来虽然Symbian的目标是跟微软的SmartPhone较劲,在采取的手段和方法上却也是不拘一格,微软更是暗暗叫苦,谁让当时vc6设计的这么开放,结果被敌人拿去做武器了。本文主要针对的是Symbian开发入门,所以应该是非常简单的事,因为毕竟Symbian的开发语言是C++,并不会因为是用于手机的操作系统就复杂了多少,就象很多人一直挂在嘴边的J2ME也毕竟是Java语言,并不会因为用在手机上就高深了多少一样。5小时是我从对Symbian一无所知到完成本文花在Symbian上的所有时间。
因为是用于手机的操作系统,所以我们研究Symbian的话,先选定一款手机再说。Nokia的60系列平台是一个很不错的选择,Nokia根据手机的屏幕大小和价格高低把手机分成了多个系列,60系列目前有两款手机:7650和3650。60系列采用Symbian os 6.1,然后又根据手机屏幕的特点对UI做了一些修改,这个被修改了的Symbian就被称为Nokia的60系列平台。
所以入门的第一步就是要下载S60的SDK,可以从Nokia的开发论坛上下载:http://www.asia.forum.nokia.com/chinese/sch/main/series60.html。看Nokia网站上最新的是1.0,不过下面又有个0.9中文版,所以自然要下载这个0.9版了。100多兆吧,不想下的话,可以跟Nokia要光盘,估计他们应该很高兴给。这个0.9中文版的模拟器是中文版的,而且有支持GBK和UNICODE转换的类,不知道1.0的英文版有没有。
下载完了就是安装,选一个目录装就是了,不过最好装在C盘上。可能是考虑到Windows平台和Unix平台都能用的缘故,这套SDK在处理盘符和目录时比较弱智,我当时SDK装到C盘,自己的程序放到D盘用vc6生成新项目就有问题,经观察是盘符的问题。所以保险起见的话,最好装在C盘,有兴趣的可以替Nokia测试一下。另外,还需要Java的运行库和Perl,SDK里也都带了,不过他自带的Perl在我的XP下装有问题,我下载了一个最新的ActivePerl才最终算是安装完毕。从SDK的安装来看,这帮搞手机的搞软件好像确实不太专业。
刚才说了,我的Symbian安装到了C盘,在C盘的Symbian目录下,有一个6.1的目录,6.1目录下有两个目录:Series60和Shared。还好,从名字上能看出大体的意思。请一定注意Series60目录下的Epoc32\BUILD目录,因为这个目录以后要反复的用到。
接下来的任务就是要编译一下HelloWorld,然后再运行一下看看了。首先得确认你的系统装VC6了(最好能装sp3以上,否则将来用到vc6时会报警),而且得把
C:\Program Files\Microsoft Visual Studio\VC98\Bin
放到你的PATH里,主要是用nmake.exe。所以如果你有nmake的话,不装vc6也可以看helloworld。
找到helloword例子的目录,在我这里是
C:\Symbian\6.1\Series60\Series60Ex\HelloWorld\group
Symbian里,一个Project通常是按inc,src,group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行
bldmake bldfiles
这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在C:\Symbian\6.1\Series60\Epoc32\BUILD下生成C:\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\SERIES60\SERIES60EX\HELLOWORLD\GROUP这个深的一个目录,并在最底层目录下生成一堆.make文件。(实在理解不了为什么要这么搞?因为他们是生产手机的?)
虽然它生成了这么多东西,但是我们不要管,继续输入
abld build wins udeb
这个命令会编译我们的程序,最后在
C:\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB
目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,打开other目录就可以运行helloworld了。
如果要在VC6里编译和运行HelloWorld,在运行完bldmake bldfiles后,运行abld makefile vc6,则会生成vc6的dsw文件,位置在
C:\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\SERIES60 \SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS
看Symbian把这点事搞得这么麻烦,也真是不容易。
如果要直接在vc6里创建新项目的话,要把
C:\Symbian\6.1\Series60\Series60Tools
目录下的文件拷贝到vc6的模板目录下才可以。
折腾到这里,可能得花2个多小时吧,剩下的两个多小时得看看文档了。
先看看HelloWorld的帮助文档,理解一下Symbian程序的体系结构。Symbian程序也是按照VC的文档视图结构来组织程序的,有Application类CAknApplication,有Document类CAknDocument,有Frame类CAknAppUi,有视图类CCoeControl等,跟vc的结构好像是差不多的,但感觉上它的Document类好像是做样子的,我还没看到这一块。关于这些类之间的调用关系,在HelloWorld的文档里有个顺序图非常好,一看便知。
在看Symbian的代码时,感觉最不适应的可能就是经常看到PushL和Pop函数,还有就是很多的函数都有L或LC的后缀。其实这是Symbian的例外处理机制。比如说我们定义了一个指针,给它分配了空间,可是在使用它的时候程序突然间出现了致命错误中止了,那这个指针占用的地址空间我们肯定是收不回来了,在PC上编程这一点可能问题不大,内存那么多,而且用不了多长时间就重启动了,但是Symbian的设计者可能认为这在手机上是不行的,所以对这一点做了很多的设计。Symbian有一个Clean up stack,在使用指针时,用PushL把指针压入栈中,使用完后在用Pop弹出栈,如果在中间调用可能导致崩溃的函数时果真出现了问题,那么Clean up stack可以通过调用该指针的析构函数回收占用的空间。这些可能导致崩溃的函数在Symbian里被称为可能Leave的函数,所以就在这些函数的尾部加了一个L。而加LC后缀的函数表明该函数已经在内部把指针用PushL压入clean up stack了,调用时无需再用PushL,直接调用完用Pop既可。Clean up stack还提供了一个PopAndDestroy函数,就是弹出栈后再销毁指针。顺便提一句,正式因为有了Clean up stack机制,所以Symbian在有些地方看起来跟VC的程序不太一样,比如说很多类的构造函数都不用,用NewL或NewLC构造,分配地址时的操作符new()也变成了new(ELeave)。上述内容可以看一下Symbian编程基础中的内存管理一节。
Symbian自己定义了一堆的数据类型,如果不想找麻烦的话,还是乖乖的用这些类型的好。简单说一下,整型有TInt和TUint,其中又分为8位的,16位的和32位的,如TInt8,TInt16,TInt32;文本类型是TText,又细分为TText8和TText16,但内部都是Unicode的,所以实际上内部引用应该都是TText16;bool型是TBool,对应的值有ETrue和EFalse;浮点型是TReal,但又分为TReal32和TReal64;还有一个引用类型TRefByvalue<T>,是以模板类的形式提供的。
因为Symbian是冲着更面向对象设计的,所以在我们常见的字符串这块变化比较大,在Symbian里叫descriptor。最底层的是两个抽象类TDesC和TDes,实际上TDes也是继承的TDesC,TDesC中的C字母是常量constant的意思。即带C字母结束的都是定义的常量,是不可以修改的,而不带C的都有一个最大长度的限制,是可以修改的,下面也是同样的道理。指针描述符是TPtrC和TPtr,类似于C++中的char *;缓冲区描述符(Buffer descriptor)是TBufC和TBuf,类似于char [];堆描述符是HBufC,类似于(char *)malloc(length+1)的用法。具体用时,上述的类型又分为8位的和16位的。举个例子:
TBuf<64> buf;
CEikonEnv::Static()->ReadResource( buf, R_EXAMPLE_VIEW_TITLE );
先定义了一个最大长度是64的缓冲区,然后读入名为R_EXAMPLE_VIEW_TITLE的资源。
再例如:
TText8 *str = (TText8*)"示范窗口标题";
TPtrC8 source( str );
iInfoText = HBufC::NewL( source.Length() );
TPtr16 ptr = iInfoText->Des();
定义一个8位的字符串str,然后构造一个指针常量source,根据source长度再定义一个16位的指针,下一步我这里没写,但明显着应该是把gbk的转换为unicode了。
Symbian的资源文件一般是以rss为扩展名的,没有专门的资源文件编辑器,用户必须用记事本打开rss文件手工编写rss文件。这个都有一定的规则和方法,参考例子不难编写自己的资源文件。需要注意的一点是,如果资源文件里包含中文,那么必须把文件另存为utf-8格式的才可。
入门相对来说是比较简单的,但精通就需要大量的实践了。 ^_^
选择开发移动应用程序的数据库
转自:天极网 时间:2003年10月18日22:59
第一节 引言
也许开发所有的网络和企业应用程序项目必须做的事情就是使用关系数据库管理系统(RDBMS)来有效的处理存储和检索基于表的数据的操作。RDBMS已经成了最流行的数据库管理系统(例如Oracle 9i ,MS SQL Server和IBM DB2),而且也包括以存储过程和触发器的形式在数据库内直接编码应用程序逻辑的能力。像Oracle 9i 和Sybase Adaptive Server企业版这样的高级数据库甚至包括用于开发操作数据的Java存储过程或Servlet的数据库中运转Java虚拟机的功能。
这些工业应用的企业级数据库产品都可使用通用SQL语言存取数据并使用像ODBC 或 JDBC这样的标准化数据库应用程序接口进行查询。这些技术已经发展到任何IT项目无论大小,离开关系数据库就无法工作的地步。面对来自产品经理和用户们日益高涨的把现有的应用程序“可移动化”的请求,然而令企业应用程序开发者大吃一惊的是移动平台的数据库访问机制还未成熟。
像Palm OS和 Window CE 这样的平台支持本地文件系统,用于在列表格式中存储数据;然而,这些文件系统实际上是非常简单的系统,不能通过SQL查询。这使开发者不得不手工编码每一个自定义数据存储和检索的解决方案。
我还应该提到,移动平台系统的数据库应用程序接口显然是完全不同的,并且你还需要编写你们自己的数据同步化代码以确保手持设备上编辑的内容能够返回企业数据库中。
第二节 移动数据库应用程序开发技术
默认情况下,PDA平台上的数据同步化是通过使用由开发者编写的一个管道(conduit)处理的。当一个Palm用户按下Sync按钮时,管道软件(驻留在用户系统中的DLL或COM对象)访问 Palm系统数据库并检索一个或更多指定的表。如果需要的话,这个操作可以使用一个ODBC/JDBC调用插入或更新一个企业关系数据库,如果没有其他的任务的话,这个操作就相当地简单。
Palm甚至为 Java、 COM和 C/C++开发者提供 Conduit SDK。然而,万一万恶的老板还让你的应用程序能够被 Windows CE支持并且被手提电脑支持,老天,我们该怎么办?这可能就产生了三个数据库模块(手提电脑中的 JDBC/ODBC/ADO,Palm OS上的 Palm数据库应用程序接口以及Windows CE中的 ADOCE)以及三个同步化解决方案(从手提电脑到服务器的 TCP/IP套接字,从Palm到Conduit的HotSync以及从 WinCE设备到Conduit的 Microsoft ActiveSync )。
别害怕,符合我们需要的移动关系数据库已存在了!事实上,随着版本的不断提升,这些移动数据库的功能正变得越来越强大。这其中有许多中数据库系统可以使用在多个平台上,可以使用流行的程序设计语言如 C/C++、 Java和 Visual Basic,以及服务器端的数据合并和同步化。本文中,我们将探讨三种流行的提供多操作平台和程序设计语言支持的数据库产品。
第三节 Sybase SQL Anywhere/Ultralite
当前的移动数据库市场的领头羊(超过60%市场份额)是 Sybase的 SQL Anywhere 产品。这种产品的最初的版本是定位于需要同步支持服务器版本的 Sybase数据库( 现在命名为 Adaptive Server Enterprise)的移动用户。发展了几年以后,这种产品已经慢慢的包括了一个微型的关系数据库,通常称为 Ultralite,可以在多种平台上配置并且支持许多同步化选项。虽然SQL Anywhere数据库是一个功能强大的SQL数据库,并且包括了安全性和高端数据库功能比如存储过程和触发器,但是如果你正在多个移动平台上配置应用程序的话你可能会对Ultralite更加有兴趣。现在, Ultralite可用于 Windows 95/98/NT 、 Palm OS、 Windows CE和 EPOC 。它的应用程序接口可用于 C/C++ 和 Java程式语言,并且这些应用程序接口在所有的支持的平台上保持不变。
不象其他从台式机移植到移动设备上的关系数据库系统那样,Ultralite数据库是特意为没有硬盘的设备设计的,这意味着这个数据库在存储器使用上已达到最优化,即使使用最小的内存也能提供最高的性能。SQL Anywhere包含的另一个强大功能是MobiLink 同步技术。MobiLink是一个基于服务器的同步化引擎,它可以通过串行口、 TCP/IP、 HTTP 、 HotSync 、 ScoutSync或 ActiveSync连接与远程客户通信。使用象 MobiLink 这样的通用同步技术可以极大地削减开发费用,因为MobiLink能够处理高级的同步操作,比如瞬象(snapshot)和时间戳同步、主键维持、冲突的检测和解决等。在服务器端,所有的MobiLink同步逻辑都是通过使用后台数据库的SQL的事件处理的( MobiLink通过 ODBC 连接数据库,所以事实上支持所有的SQL数据库),通过使用 Certicom的 SSL/TLS Plus 来支持公钥加密功能(使用椭圆曲线加密系统技术)。如果在编写应用程序前把可能发生的时间都考虑好的话,那么 SQL Anywhere/Ultralite 组合将是一个极强大的移动数据库和同步解决方案可以满足任何任务。
第四节 Oracle 8i Lite
虽然Sybase可能已经领引了移动计算技术市场空间,但是我们也不能否认Oracle在企业数据库世界中的重要作用。象Sybase的相应产品一样,Oracle 8i Lite产品可用于所有主要的移动平台(Win32、 Windows CE、 Palm OS和EPOC)并且在某些地方还超出了Sybase Ultralite。8i Lite包含完整的与后台Oracle数据库同步的能力;然而,这种产品并不就此止步。也包括了 Windows CE和 Win32的 ODBC客户机和 C/C++/Java/ActiveX应用程序接口支持。这种产品的另外两个特性也许更能引起大家的兴趣:Oracle Mobile Agent和Web-To-Go:
·Oracle Mobile Agents最初市场定位在独立无线中间件产品,但是1999年被收录入8i Lite产品中。Mobile Agents是一个通信解决方案,允许 Oracle 8i Lite应用程序通过网络执行无线同步操作,这些网络有CDPD(AT&T Wireless使用)、Mobitex(Cingular Wireless使用)和 DataTAC 4000/5000(Motient使用)。Oracle Mobile Agents通过使用应用程序队列处理信息。这个队列也与运行Oracle高级队列( Advanced Queuing)选项的后台Oracle数据库和包括 8i Lite的 AQ Lite产品整合。
· Web-To-Go既是数据同步又是一个应用程序部署解决方案。建立在通用网络开发技术诸如∶ Apache和 Java servlets, Web-To-Go允许一个网络应用程序 (对于Win32平台 )在服务器内被存档然后自动地、同步地配置到客户机中。Web-To-Go通过Java存储过程或JDBC支持数据库逻辑的开发并且对于那些现有的使用Java servlets构建的网络应用程序来说它是一个非常强大的移动解决方案。
我相信市场现在对于 Oracle提供的产品多多少少觉得有点混乱,因为 8i Lite的各个部分曾经分别上市(Web-To-Go、Oracle Mobile Agents、Oracle Lite等)。另外, Oracle自己的 OracleMobile解决方案定位在只用于无线应用解决方案诸如∶ WAP、 SMS和 VoiceXML,也已经能够从 8i Lite那里吸引来不少目光。然而,对于那些开发工业强度的解决方案同时又需要无线通讯的人来说, 8i Lite是一个数据库、同步化、中间件和应用程序部署技术的综合体。
第五节 PointBase 4.0袖珍版
象IBM(DB2 Everywhere)与微软(SQL Server CE)这样的公司也开发了用于多种平台的移动数据库系统,这些产品的能力都非常强大,使用DB2 或SQL Server数据库工作的开发者也将很快熟悉这些数据库产品。但除此之外,我还想介绍进军企业级数据库市场的一只新军:PointBase。
PointBase 非常独特,因为它是第一个经过认证的100%纯Java数据库,可用于任何使用的 Java 2 标准版虚拟机(JVM)的平台。在2001年6月的JavaOne大会上,PointBase发布了PointBase 袖珍版产品——一个为 J2SE 和 J2ME 环境设计的占用资源少的(不到 45KB )数据库。如果你的目标平台包含一个兼容J2ME的虚拟机,PointBase允许你部署一个SQL数据库应用程序。J2ME MIDP 虚拟机目前可用于Win32,Palm OS,Windows CE和摩托罗拉IDEN电话。
本文地址:http://com.8s8s.com/it/it34422.htm