在以前的文章(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

更多相关文章

  1. Android 学习日记(二)android studio运行github代码
  2. Android Apk反编译得到Java源代码
  3. Android 通过java代码实现EditText输入限制
  4. 傻瓜式建立数据库,高效数据库操作代码的编写--android
  5. 15个开发者最亲睐的Android代码编辑器
  6. Android源代码调试环境搭建
  7. Android获取设备IP地址代码与分析
  8. Android之React Native平台与Android本地模块之间的调用
  9. 【Android】利用Java代码布局,按钮添加点击事件

随机推荐

  1. Android(安卓)Jetpack Compose 之 Text
  2. Android(安卓)Stagefright MPEG4Extracto
  3. Android(安卓)简单的网络变化监听器
  4. Android(安卓)Studio多个Module依赖同一
  5. android通过号码查询联系人姓名
  6. Android(安卓)Fastboot源码分析
  7. Android(安卓)手机相机自动对焦
  8. textview之url
  9. Android中从服务器端向客户端传数据
  10. android 实现一直震动和间歇震动