编译 Symbian 下可用的 SDL

SDL 是宣称支持 Symbian 平台的。不过,如果你计划把下载下来的 SDL 代码包解开编译就能看到效果,那就很可能会失望。据我的了解,这样的失望概率大概要在 90% 以上。

SDL 自带的 GrayWin 例子,会一声不响地退出,没有任何可以帮助你得到改进信息的提示。如果你足够仔细,可能会在调试器中看到某个 Panic 的数值,然而,那是没有任何价值的。

经过老汉不懈的探索,终于发现了 SDL 里原来的代码中存在的问题。备忘如下。

1、SDL.mmp 文件中缺少了 cpuinfo\SDL_cpuinfo.c,需要补充进去
2、需要对 SDL_epocvideo.cpp 文件进行必要的修改,其中有一个极为严重的 BUG,以下语句:
User::LeaveIfError(Private->EPOC_WsWindow.Construct(Private->EPOC_WsWindowGroup,WindowClientHandle));
应该改为:
User::LeaveIfError(Private->EPOC_WsWindow.Construct(Private->EPOC_WsWindowGroup,WindowClientHandle+1));
按照 Symbian 的文档,窗口句柄必须保证唯一性,WindowClientHandle 已经在前面的代码中被用于 WindowGroup 的句柄,而 WindowGroup 其实是一种特殊的窗口,所以在此是不可以原封不动地作为要创建的窗口的句柄的。此代码最初好像是针对 Nokia 9210 写的,如果 Nokia 9210 上这样能够运行的话,也并不能证明该代码的正确性,只能说 Nokia 9210 的实现违背了 Symbian 的约定。
3、在 SDL_epocvideo.cpp 中加入对自己的设备的屏幕分辨率的支持。共有两处,一是在 EPOC_VideoInit() 函数中,另一则是在 EPOC_SetVideoMode() 函数中。

当然,graywin.c 也需要做点小小的改动,把代码里写定的窗口宽高由原来的值改为符合你的 Symbian 设备的值。

经过上面的步骤,就可以编译运行了(在 S60 2.x SDK 下测试 GrayWin 通过)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注