(1)模拟器里面测试的程序如何删除?
for s60 2nd平台:
删除/epoc32/release/wins/udeb/z/system/apps/myapp的目录即可
for s60 3rd平台:
a、删除/epoc32/release/winscw/udeb/myapp.exe
b、删除/epoc32/release/winscw/udeb/z/private/10003a3f/appmyapp_reg.rsc
c、删除/epoc32/release/winscw/udeb/z/resource/apps/myapp_aif.mif
d、删除/epoc32/data/z/resource/apps/myapp.rsc
(2)生成log文件的方法
for s60 2nd/3rd都是一样的方法,使用RFileLogger类,这个类与nokia无关,是
symbian os提供的记录log的方法。
在需要打印log的cpp文件中添加:
#include
在mmp文件中添加
LIBRARY flogger.lib
在手机的存储中创建目录C:\Logs\目录,然后把自己想要的subfolder目录也创建
出来,对于s60 2nd平台,直接用fexplorer或者system explorer在手机上创建
即可,对于s60 3rd平台,就没那么简单了,内置浏览器看不到,需要装y-browser
才能看到,至于目录,可以用BaflUtils类来判断一下是否存在。
使用方法:
RFileLogger flog ;
// 连接那个RFs
flog.Connect() ;
// 创建log,将保存在c:\Logs\subfolder\mylog.log(这个subfolder需要手工创建)
flog.CreateLog(_L("subfolder", _L("mylog.log", EFileLoggingModeOverwrite) ;
// 具体使用查一下文档
flog.Write(xxxx) ;
// 类似TBuf的FormatL的语法
flog.WriteFormat(xxxx) ;
// 剩下的就是关闭方面的动作了
flog.CloseLog() ;
flog.Close() ;
(3)s60 2nd/3rd模拟器联网问题
s60 2nd比较麻烦,需要下载prnesock.lib和prnesock.dll,这两个都需要拷贝到目录
/epoc32/release/wins/udeb/
(我上传了这两个文件,就在下面)
下面,然后在mmp文件中添加如下条件编译代码:
#if defined(WINS)
LIBRARY prnesock.lib
#else
LIBRARY esock.lib
#endif
在自己的实际代码中,涉及到接入点以及RConnection操作的都要用
#ifndef __WINS__ 或者 #ifndef __WINSCW__
#endif
给括起来,直接调用iSocketServ.Connect()即可实现在模拟器上利用win32的socket
连网和单步调试。这一点可以参考我发布的NetTest的代码。
文件: prnesock.rar
大小: 19KB
下载: 下载
(4)s60 2nd程序中查找全局变量的方法
在mmp文件中添加:
OPTION GCC -save-temps
就会看到很多.S和.ii的文件,在里面查找是否含有.bss就可以知道你在哪里使用了
全局变量,.bss段的变量名称,就是全局变量的名称。
(5)s60 3rd模拟器启动以后总是NCNList KERN-EXEC 3 panic解决
这是s60 3rd fp1 sdk的emulator的bug,这个ncnlist是由于
New Message Notification API包不支持导致的。可以通过打上nokia的补丁解决。
这个API主要是为MTM编写者使用的(恰好影响到偶的开发),常规的application开发者
可以不必理会。为了方便起见,把这个补丁也贴上来:
文件: NCNList_fix.zip
大小: 96KB
下载: 下载
使用方法,直接解压缩,然后覆盖到epoc32里面即可。
(6)s60 3rd得到自签名cert的生成方法
makekeys -cert -password yourpassword -len 512 -dname "CN=yourname OR=yourname" yourkey.key yourcert.cer
使用的时候,可以用如下命令:
signsis xxxx.sis xxxx.sisx yourcert.cer youkey.key yourpassword
这种方法得到的签名只能够具有basic capabilities:
LocalServices, UserEnvironment, NetworkServices, ReadUserData,
WriteUserData
(7)s60 3rd使用publisher id以后的cert可以得到的capabilities
Basic Cap:
LocalServices, UserEnvironment, NetworkServices, ReadUserData,
WriteUserData
Extended Cap:
Location, SwEvent, SurroundingsDD, ProtServ, PowerMgmt, ReadDeviceData
WriteDeviceData, TrustedUI, NetworkControl, MultimediaDD, CommDD,
得不到的有(其实也能得到,但是需要进一步跟设备厂商联系):
AllFiles, DRM, TCB, DiskAdmin
(8)s60 3rd修改stack和heap默认大小的方法
在project的mmp文件中添加下面的定义即可:
EPOCSTACKSIZE 0x2800
EPOCHEAPSIZE 0x1000 0x32000
前一个值是heap的最小值,后一个是最大值。
或者可以在代码中动态修改堆的大小,在projectname.cpp文件中找到E32Main函数
GLDEF_C TInt E32Main()
{
RHeap * heap = UserHeap::ChunkHeap(NULL,0x200000,0x300000) ;
User::SwitchHeap(heap);
return EikStart::RunApplication( NewApplication );
}
使用User::SwitchHeap()函数来获得相对大一些的系统堆大小。
(9)s60 2nd/3rd的结构体字节对齐问题
注意,在这里由于symbian os用的是gcce的修改版,所以标准c++的那一套
#pragama pack([n])
这种在win mobile上面工作良好的编译预处理,在armi或gcce版本中会被编译器忽略。
解决方案是在头文件中添加:
#if defined(__WINS__)
#define PACKED
#else
#define PACKED __attribute__((packed, aligned(1)))
#endif
在结构体定义中添加:
typedef struct _AABBCC_ {
TUint a ;
TUint8 b ;
} PACKED AABBCC ;
而且,如果决定要处理字节对齐的话,最好所有的结构体都采用字节对齐的定义方式。
(10)关于Carbide C++的快捷键问题
编辑相关
Ctrl+ ↓ Ctrl+↑ 在编辑区上下滚动(滚动滑块)
Ctrl+ ← Ctrl + → 向前向后移动一个单词
Ctrl+ Shift + ↓ Ctrl+ Shift + ↑ 向上向下移动一个段落(可以方便的在函数方法中滚动)
Ctrl+G 搜索工作区中的声明
Ctrl+ Shift +G 搜索所有引用
Ctrl+ Shift +S 保存所有文档
Ctrl+F 查找替换
Ctrl + J 增量查找(根据动态键盘输入进行动态匹配)
Ctrl + k 查找替换下一个
Ctrl + L 转到指定的行号
Ctrl+ Shift + F4 关闭所有编辑窗口
Ctrl + SHIFT + P 匹配对应的括号
CTRL+SHIFT+X 将选中的小写转换为大写
CTRL+SHIFT+Y 将选中的大写转换为小写
Ctrl+M 将当前窗口在最小化和最大化之间切换
Ctrl+Q 定义最后编辑的地方
Ctrl+O 快速显示 OutLine
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表
Ctrl+` 在c/c++中非常有用的功能 打开相关的源文件或头文件
Ctrl+D 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交换位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交换位置(同上)
编译、运行
Ctrl+B - 重新编译所有项目.
F11 - 调试(Debug)当前项目.
Ctrl+F11 - 运行当前项目.
Ctrl+. and Ctrl., - 转到下一个/前一个提示项目。当编译器为我们生成了很多编译警告等信息的时候,这个功能将发挥区大的作用。
Ctrl+Shift+B - 切换当前行的断点状态。注意,该快捷键仅仅在调试界面下是可用的,在Symbian开发界面下是不可用的。
Ctrl+Alt+B 程序编辑目标项目
调试
F5 - 进入当前行函数.
F6 - 执行当前行.
F8 - 继续执行.
Ctrl+R - 执行到当前行.
重构相关
Alt + shift + r - 变量名函数名重构
阅读源码
F3 - 查看变量的声明
F4 - 查看某类的继承层次关系
Ctrl + T 快速查看类的继承关系
导航相关
F2 - 使编辑视图获得焦点
ALT+SHIFT+W 当焦点在编辑区的时候显示源文件的导航视图(Outline,Navigator,C++ project)
Ctrl+F6 ,Ctrl+ SHIFT+ F6 在编辑视图中对打开的文档进行进行切换(类似于WINDOWS的 ALT+TLB和 ALT+SHIFT+TBL)
Ctrl+F7,Ctrl+ SHIFT+ F7 对全局视图进行切换
Ctrl+F8 ,Ctrl+ SHIFT + F8 - 界面组的切换 ,这个快捷键可以切换Symbian界面组和调试(Debug)界面组。
在Carbide.c++中我们可以设置菜单的Window | Preferences | General | Keys选项中,修改当前的快捷键配置。加入你熟悉了其他IDE工具的快捷键配置,那么修改Eclipse/Carbide.c++的当前设置可能会是十分有帮助的。(我本人就是这样,钟情于emacs)可以这样修改Carbide C++环境:
Window->Preferences->General->Keys->Modify->Scheme->Emacs
这样就行了,用起来很爽的说。
(11)关于symbian中进行unix环境下的Universal Time和TTime转换的方法
_LIT(KDateString1,"%D%M%Y%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%.%*C4%:3%+B"); // 定义显示的格式是 年/月/日 时:分:秒.000000
TTime tm;
// 这里传入的1207823088就是unix下面UTC时间的十进制表示
TTimeIntervalSeconds tm_seconds(1207823088) ;
// local是TLocale的对象,这个对象比较大,最好不要在栈上创建,
// 可以做为类的成员变量或者在堆上创建
TTimeIntervalSeconds tm_offset(local.UniversalTimeOffset()) ;
// 基准时间根据UTC的标准设定为1970/01/01,0点0分0秒。
tm.Set(_L("19700000:000000.000000")) ;
tm.FormatL(iTmpBuf, KDateString1) ;
PrintBuf(iTmpBuf) ;
// 根据unix UTC时间的定义,需要在基准时间里面加入距离基准时间的秒数,还要加入时区
// 的偏移,我们是东八区,正好需要加入8个小时
tm += tm_seconds ;
tm += tm_offset ;
tm.FormatL(iTmpBuf, KDateString1) ;
PrintBuf(iTmpBuf) ;
// 此时的tm里面就是我们所需要的symbian下的时间了。
(12)关于symbian 3rd sdk安装中遇到的一些问题
如果不能成功安装SDK,建议其参阅诺基亚论坛网站的讨论区的帖子:
Can't install S60 3rd SDK:
这个帖子提供了解决这一问题的迂回方案。开发者需要创建一个空文“S60_3rd.xml”,并将其置于3rd Edition SDK安装包被解压缩到的那个安装目录中,然后再进行安装。
如果多次安装并卸载S60 3rd edition maintenance release SDK,安装文件目录的名字将不断改变,如“\Symbian\9.1\S60_3rd_MR_1”或“\Symbian\9.1\S60_3rd_MR_2”为去除安装序列号“1” 或“2”,开发者需要于安装前从Windows注册表中删除下列键值:HKEY_LOCAL_MACHINE\SOFTWARE\Nokia\com.nokia.s60。
Under HKEY_LOCAL_MACHINE\SOFTWARE\Nokia look for a key called "com.nokia.s60" ( or "S60_3rd_FP1" for S60 3rd SDK FP1). After uninstalling the SDK delete this key from the registry (alternatively you can modify the value of the "Instances" string under this key) and on the next install the counter starts again from 0.
(13)关于symbian 3rd中对于Open C库的支持
根据我的实验,目前最新版的Open C库是s60_openc_plugin_MR.zip,
需要配合配套的symbian 3rd sdk MR版本的才好用。
(14)在symbian中根据文件名得到该文件的路径
TFileName full_fname;
full_fname = iEikonEnv->EikAppUi()->Application()->AppFullName();
TFileName full_path;
TParse parse;
parse.Set( full_fname,NULL,NULL );
full_path.Copy( parse.DriveAndPath() );
(15)在symbian 2nd, 3rd移植的时候,显示不出来about文本消息
这个问题主要是3rd的Ui类中的ConstructL()函数引起的,尽管在2nd和3rd的平台上都可以直接使用BaseConstructL()无参数和有参数的版本。但是,在需要显示about dialog文本的时候,而且是在为3rd开发的时候,最好加上BaseConstructL(EAknEnableSkin)这个带参数的调用。这样才不会在显示的时候出现问题。