北京理工大学 20981 陈罡
(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 <flogger.h>
在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的代码。
(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开发者
可以不必理会。为了方便起见,把这个补丁也贴上来:
使用方法,直接解压缩,然后覆盖到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:
http://discussion.forum.nokia.com/forum/showthread.php?t=89744&highlight=s60_3rd.xml
这个帖子提供了解决这一问题的迂回方案。开发者需要创建一个空文“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)这个带参数的调用。这样才不会在显示的时候出现问题。
(16)在symbian 3rd的sdk中调试exe程序的方法
如果采用vs2005+carbide.vs插件来调试exe的话,按下F5启动模拟器以后,会莫名奇妙地打开一个白色的命令行窗口,这个窗口叫做“eshell”。这时候,需要开发人员手工启动这个exe程序(当然需要现在程序中设置好断点了)。
具体操作如下:
(a)cd private [回车]
(b)myappname [回车]
这里的myappname就是你需要调试的exe的名字了。这种方法的优点在于,如果exe有屏幕绘图或者按键截获操作,也就是跟CWsSession有些关系的话,就可以用这个方式,既启动了模拟器的Windows Server又可以通过eshell手工启动你的exe。缺点是epoc启动速度太慢,需要等一段时间。
还有一种更迅速的方法,就是修改配置文件,例如:
C:/Symbian/9.2/S60_3rd_FP1/Epoc32/Data/epoc.ini
在该文件的第一行加入一句textshell,然后保存关闭。当运行epoc启动模拟器的时候,随之启动的还有一个蓝色的console输出窗口。然后的过程就跟上面一样,首先单击一下模拟器,让它获得焦点,然后用键盘输入上面的(a),(b)两句即可。这种做法的好处在于模拟器启动相当快,直接进入textshell模式,缺点是没有开启windows server对于有ui操作的exe来说,只能用第一种方案了。最后调试完毕后,不要忘记把epoc.ini文件恢复原状。
(17)手工读取手机的相关信息
*#06# : 读取手机的imei
*#0000# :读取手机固件(firmware)版本号
*#2820# :读取手机蓝牙设备的Mac地址
(18)关于手机屏幕旋转问题
在symbian签名过程中,由于很多手机都添加了“重力传感器”,会“智能”地旋转屏幕,而对该旋转屏幕的支持是symbian签名中必须要测试的。所以,需要找到一个好的解决方法:
需要在UI中定义void HandleResourceChangeL( TInt aType );
具体实现:
void CXXXXXXXXAppUi::HandleResourceChangeL( TInt aType )
{
CAknAppUi::HandleResourceChangeL( aType ) ;
if(aType == KEikDynamicLayoutVariantSwitch) {
if(ApplicationRect().Size() == TSize(320,240)) {
_log->print(_L8("screen changed to 320x240!/n")) ;
iInvDlg = new (ELeave) CInvalidScreenDialog(KInvalidScreenText);
iInvDlg->ExecuteLD(R_INVALID_SCR_DIALOG) ;
} else {
_log->print(_L8("screen changed to 240x320!/n")) ;
if(iInvDlg) {
iInvDlg->DlgSelfDestroy();
iInvDlg = NULL;
}
}
}
}
当然这个dialog可以是自己定义的,从CAknDialog或者CAknQueryDialog派生的均可。
(18)关于N73上无法显示图标的问题
s60 v3 fp1的sdk里面有一个很让人恼火的地方,就是n73的桌面上面无法显示程序的图标,根据nokia论坛中的描述,这个问题是由于mifconf这个程序导致的,因为到了v3 fp1的时候,mifconf程序将svg图标的压缩功能默认开启了,但是很遗憾n73不知道为何不支持这个压缩过的svg图片,因此,无法显示。
那么解决这个问题的方法很简单:
a)从s60 v3 mr版本的sdk中拷贝一个mifconf程序,覆盖掉s60 v3 fp1的mifconf,然后重新编译即可。(因为mr版的sdk中mifconf没有默认打开svg的压缩功能)
b)修改group目录下面的Icon_aif_scalable_dc.mk文件,在下面行上添加一个/X的选项即可。
$(ICONTARGETFILENAME) : $(ICONDIR)/qgn_menu_OdpMain.svg
mifconv $(ICONTARGETFILENAME) /
/H$(HEADERFILENAME) /
/c32,8 $(ICONDIR)/qgn_menu_OdpMain.svg
看上去类似这样:
$(ICONTARGETFILENAME) : $(ICONDIR)/qgn_menu_OdpMain.svg
mifconv $(ICONTARGETFILENAME) /
/H$(HEADERFILENAME) /
/X /c32,8 $(ICONDIR)/qgn_menu_OdpMain.svg
这里的/X代表让mifconf程序不进行svg的压缩操作。
发表于: 2008-04-03,修改于: 2009-07-27 16:52,已浏览2504次,有评论2条 推荐 投诉 补充一点,如果习惯在linux下面开发的朋友
(我本人就是这样,钟情于emacs)可以这样修改Carbide C++环境:
Window->Preferences->General->Keys->Modify->Scheme->Emacs
这样就行了,用起来很爽的说。
引文来源 s60 2nd/3rd开发小tips(随时想到随时加) - 手机开发 - chenwayne