Symbian OS的入门资料并不好找,sdk的帮助文档内容纷杂,组织结构也不适合作为入门者的参考资料。Symbian C++是对C++语言的改进,尤其是在异常处理方面更是为了适应手机硬件平台做了改进。
- // helloSymbian.cpp
- #include <e32base.h>
- #include <e32cons.h>
- // Global Variations
- LOCAL_D CConsoleBase* gConsole;
- // Console Process
- void ConsoleMain()
- {
- // Call function
- gConsole->Printf(_L("Hello world!/n"));
- gConsole->Printf(_L("Press any key to continue.../n"));
- gConsole->Getch();
- }
- // Entry Point
- GLDEF_C TInt E32Main()
- {
- __UHEAP_MARK;
- // Get a console
- gConsole = Console::NewL(_L("Hello Text"),TSize(KConsFullScreen, KConsFullScreen));
- ConsoleMain();
- delete gConsole;
- __UHEAP_MARKEND;
- return 0;
- }
在同一文件夹中建立HelloSymbian.mmp,文件内容如下:
- // HelloSymbian.mmp
- TARGET HelloSymbian.exe
- TARGETTYPE exe
- SOURCEPATH .
- SOURCE HelloSymbian.cpp
- USERINCLUDE .
- SYSTEMINCLUDE /epoc32/include
- LIBRARY euser.lib
在同一文件夹中建立BLD.INF,文件内容如下:
- // BLD.INF
- PRJ_MMPFILES
- HelloSymbian.mmp
到此,HelloSymbian代码文件创建完毕,以下是编译过程:
在控制台中进入HelloSymbian所在目录,执行以下命令:
- bldmake bldfiles
- abld build winscw udeb
生成的可执行文件在sdk安装目录/epoc32/release/winscw中,名为HelloSymbian.exe。
下面我们简要介绍一下HelloSymbian.cpp的代码文件:
- #include <e32base.h>
- #include <e32cons.h>
e32base.h中定义了所有在堆上实现的基类;
e32cons.h是console的定义。
- void ConsoleMain()
- {
- // Call function
- gConsole->Printf(_L("Hello Symbian!/n"));
- gConsole->Printf(_L("Press any key to continue.../n"));
- gConsole->Getch();
- }
ConsoleMain()函数是实现了在Console上输出一些字符的功能。
gConsole->Getch()等待用户在控制台上输入一个字符,这里我们主要是为了,让控制台一直处于等待状态,让我们能看到打印出来的提示字符。
- GLDEF_C TInt E32Main()
- {
- __UHEAP_MARK;
- // Get a console
- gConsole = Console::NewL(_L("Hello Text"),TSize(KConsFullScreen, KConsFullScreen));
- ConsoleMain();
- delete gConsole;
- __UHEAP_MARKEND;
- return 0;
- }
E32Main()是Symbian上的入口函数类似于C/C++中的main()函数。 __UHEAP_MARK 宏定义为在debug阶段检查程序分配的堆,它和__UHEAP_MARKEND成对使用。
Console::NewL()函数构造一个console对象,你也许注意到在Symbian中的对象构造和C++中很不一样,这与Symbian处理异常的机制有关,(大家可以在我的博客的其他文章中了解Symbian的异常处理机制。) 之后调用ConsoleMain在console上打印出提示字符,最后释放gConsole。
下面我再提供一个版本的HelloSymbin代码,这个代码中用到了CleanupStack等更符合Symbian程序的习惯:
- //HelloSymbian.cpp
- #include <e32base.h>
- #include <e32cons.h>
- LOCAL_D CConsoleBase* gConsole;
- // Real main function
- void MainL()
- {
- gConsole->Printf(_L("HelloS ymbian!/n"));
- gConsole->Printf(_L("Press any key to continue.../n"));
- gConsole->Getch();
- }
- // Console harness
- void ConsoleMainL()
- {
- // Get a console
- gConsole = Console::NewL(_L("Hello Symbian"),
- TSize(KConsFullScreen, KConsFullScreen));
- CleanupStack::PushL(gConsole);
- // Call function
- MainL();
- // Finished with console
- CleanupStack::PopAndDestroy(gConsole);
- }
- // Cleanup stack harness
- GLDEF_C TInt E32Main()
- {
- __UHEAP_MARK;
- CTrapCleanup* cleanupStack = CTrapCleanup::New();
- TRAPD(error, ConsoleMainL());
- __ASSERT_ALWAYS(!error, User::Panic(_L("Hello world panic"), error));
- delete cleanupStack;
- __UHEAP_MARKEND;
- return 0;
- }