最近在研究如何加载带alpha的png图片时遇到的这个问题,在模拟器上运行正常,图片也正常显示了,但是到了真机上程序就是不运行,后来用排除法补丁的build sis测试,最后错误定位到创建png解码器的时候,原因是找不到指定文件。
错误是这句:
CImageDecoder
*iImageDecoder = CImageDecoder::FileNewL(
[color=#FF0000]fs[/color],
aShip,
(CImageDecoder::TOptions)(CImageDecoder::EAllowGeneratedMask|CImageDecoder::EOptionAlwaysThread));
一通search之后发现问题处在取得privatepath的时候,应该是这样:
[color=#008000]// 取privatepath,好在后面加载一些该目录下的资源[/color]
RFs [color=#FF0000]fs[/color];[color=#008000]// = iCoeEnv->FsSession();[/color]
User::LeaveIfError([color=#FF0000]fs[/color].Connect());
CleanupClosePushL([color=#FF0000]fs[/color]);
[color=#FF0000]fs[/color].PrivatePath(iPrivatePath);
[color=#008000]// 下面这部分郁闷了我1个晚上[/color]
[color=#008000]// 取得的private path前面还要根据不同的编译状态+上相应的盘符[/color]
[color=#008000]// 在真机上需要根据程序装在哪个盘添加相应盘符[/color]
[color=#008000]// 很奇怪的是如果没有下面的insert在模拟器上却是没问题的…[/color]
[color=#0000D0]#ifdef[/color] __WINS__
iPrivatePath.Insert(0, _L([color=#808080]”C:”[/color]));
[color=#0000D0]#else[/color]
[color=#008000]// TFileName appFullName = CEikonEnv::Static()->EikAppUi()->Application()->AppFullName();[/color]
TFileName appFullName = RProcess().FileName();
TParsePtrC parse(appFullName);
iPrivatePath.Insert(0, parse.Drive());
[color=#0000D0]#endif[/color]
CleanupStack::PopAndDestroy(1);
就是说取得的path是不包含驱动器名字的,所以到了真机上就变成找不到指定的文件了,但我奇怪的是为啥直接privatepath然后append文件名后在模拟器上是可以正确运行的,而这段代码也是针对了emulator build的加了个C:,更奇怪的事情是,当在真机上出错后,我曾经试过用apptrk进行真机调试,当运行到出异常之后,直接结束进程,在这之后再开这个程序png图片的路径又莫名奇妙的对了,以后就算不用trk调试运行也不会有问题,很奇怪,想不通。
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。