在以前的文章(Android图形引擎Skia移植到Windows经验总结之二和移植Android图形引擎库Skia到Windows的经验之一)中总结过移植Skia到Windows平台,一般很少有人把Skia移植Windows平台来用的,Windows平台只是一个跳板,最终一般最终目标都是嵌入式的平台,比如WinCE,嵌入式Linux,Sybian等等。我移植的目标是我们公司自己的基于MIPS平台的嵌入式平台,我们这个平台的特点是有一个OSAL(操作系统适配层),独立于各种操作系统。
移植之前的准备工作:首先需要有一份Android源码中Skia库代码;其次,为了对比方便需要到Skia官网下载一份最新的源码;再次,你需要熟悉你自己平台的各种特性,比如CPU的大小头,OS情况,编译器特性等等,都需要熟悉,否则移植的时候会遇到问题的哦。最后,你需要确认你的平台的编译器支持C++,因为Skia是以C++实现的。如果你的平台不支持C++,或者说你的平台没有很好的支持C++,那么你将会面临很多问题。我的MIPS平台上原来的编译器对C++支持的不好,因为以前我们平台的所有代码全部都是C实现的,我移植Skia的时候,需要把所有的代码用C++
编译通过,发现编译器对C++支持很烂。没有办法只有更换新的编译器,这个问题才搞定。所以一定要有一个比较好的C++编译器。
拿到代码之后,首先对代码目录进行一个大概的浏览。在根目录下面,目录看着不少,其实真正重要的只有两个目录src和include,src包含所有skia的实现源码,include目录包含公共头文件,根目录下面其他的目录都是一些辅助的功能,可以忽略之。src或者include下一层目录包括:
core/ Skia的核心代码,这部分必须要要移植
effects/ Skia一些效果的增强代码,一般这个也要移植
opt/ 性能优化的代码,可以不移植,或者用未优化的代码。
ports/ 平台相关的代码,比如字体,线程,时间等等和系统相关的代码,需要移植。
images/ 与图像相关的代码;如果希望Skia可以从图片输入或者输出则需要移植。
utils/ skia的一些工具类,需要移植。
Views/ Skia定义的一些独立于OS的窗口类,需要的话可以移植。
xml/ Skia的XML支持,需要的话移植
gl/ Skia基于OpenGL的图形加速,需要的话移植。
svg/ 矢量图形,可以不移植,Android也不支持。
animator/ 动画支持,可以不移植,Android也不支持。
对目录有了一个大概的了解,就可以下手移植了。Skia的模块话做的比较好,你可以一个一个模块的加入。我们的第一步先移植core模块,这个模块是必须移植的。我们从哪里下手呢?我们先浏览一下core模块的头文件,看看有没有config之类的文件,在include/core/目录下面,发现SkPreConfig.h,SkUserConfig.h,SkPostConfig.h三个config文件,根据经验这三个文件肯定要先被配置。先打开这个三个文件,看看文件注释里面有没有有用的信息。很幸运,在SkUserConfig.h文件头部有如下注释:
/* SkTypes.h, the root of the public header files, does the following trick:
#include "SkPreConfig.h"
#include "SkUserConfig.h"
#include "SkPostConfig.h"
SkPreConfig.h runs first, and it is responsible for initializing certain
skia defines.
SkPostConfig.h runs last, and its job is to just check that the final
defines are consistent (i.e. that we don't have mutually conflicting
defines).
SkUserConfig.h (this file) runs in the middle. It gets to change or augment
the list of flags initially set in preconfig, and then postconfig checks
that everything still makes sense.
Below are optional defines that add, subtract, or change default behavior
in Skia. Your port can locally edit this file to enable/disable flags as
you choose, or these can be delared on your command line (i.e. -Dfoo).
By default, this include file will always default to having all of the flags
commented out, so including it will have no effect.
*/
通过上面注释我们知道这三个配置文件被SkTypes.h包含,包含顺序是先SkPreConfig.h,其次是SkUserConfig.h,最后是SkPostConfig.h。我们知道了包含顺序,我们就按这个顺序来一个一个配置文件看。
SkPreConfig.h的开头就是OS的配置,可以根据自己的目标平台选择打开那个选项。代码如下:
#
if !defined(SK_BUILD_FOR_PALM) && !defined(SK_BUILD_FOR_WINCE) && !defined(SK_BUILD_FOR_WIN32) && !defined(SK_BUILD_FOR_SYMBIAN) && !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_SDL)
#
if defined(PALMOS_SDK_VERSION)
#define SK_BUILD_FOR_PALM
#elif defined(UNDER_CE)
#define SK_BUILD_FOR_WINCE
#elif defined(WIN32)
#define SK_BUILD_FOR_WIN32
#elif defined(__SYMBIAN32__)
#define SK_BUILD_FOR_WIN32
#elif defined(linux)
#define SK_BUILD_FOR_UNIX
#
else
#define SK_BUILD_FOR_MAC
#endif
#endif
我们的平台虽然是OS独立的,还是和Linux比较相近的,所以我选了SK_BUILD_FOR_UNIX。这个配置文件还定义了CPU是大头还是小头等。
另外两个文件也是配置一些平台特性比如是否支持硬浮点等等问题。
把以上三个文件配置好之后,我们才成功迈出了万里长征的第一步。后面需要移植各个模块了。
转自 http://my.unix-center.net/~Simon_fu/?p=302