Windows下将ImageMagick移植到Android平台

原文链接  http://www.pedant.cn/2014/06/18/imagemagick-ported-android/

ImageMagick是一个用来创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。在移动平台做一些较复杂的图像处理时,难免会请出这尊大神。官方网站上也说明了它可以运行在多个平台之上,包括Android。不过官方的Releases版本只有Unix、Mac OS X、IOS、Windows,并有把针对Android各种架构发布现成的二进制包。不过好在它完全是开源的,我们完全可以下载源码然后自己交叉编译(Cross-Compile)出基于arm、x86、mips运行系统的静态链接库,这样就可以在目前的Android全平台下跑起来了。

一般我们办公都在Windows平台,可是要用源码交叉编译(Source Cross-Compile)就得使用GNU环境,如果单独装一个linux虚拟机再来编译过程太过麻烦。我们可以在windows上使用MinGW工具来模拟一套GNU环境。

另外仅编译ImageMagick是不够的,我们的程序在实际应用时通常会读入一些常见格式的图片(jpeg、png),还可能需要做一些图形匹配及颜色分散统计(fftw)等。这样我们就需要编译另外一些项目,然后交给ImageMagick代理使用就可以了。故这里还需一些依赖包,同时整个编译过程还需要你机子上有其他环境。总体上我使用了下面这些:

  • MinGW v0.6.2
  • Android NDK(android-ndk-r9c)
  • fftw-3.3.4(快速离散傅里叶变换处理库)
  • jpegsrc.v9a(jpeg、jpg图片格式处理库)
  • libpng-1.6.13(png图片格式处理库)
  • ImageMagick-6.8.8(主库)

这里用到所有的资源我都打包在云盘处 http://yunpan.cn/Q7Uxr5T3XRxIa (提取码:2b2f)。

1.MinGW安装

工欲善其事必先利其器。只有把必要的环境准备好了,办起事来才会事半功倍。最新版本的MinGW你可从这里 http://sourceforge.net/projects/mingw 下载到最新的exe安装程序。这里 http://www.wowotech.net/soft/6.html 也有详细的安装过程,不过需要注意的是在MinGW Installation Manager选择安装包时我们要选上C++编译器和一些MSYS make工具。

安装完成之后,我们可以到安装目录的msys\1.0下找到msys.bat,从这里我们就可以启动命令行了。启动之前我们就使用下面的命令下载美化程序mintty(不使用mintty的话自带的命令行太难用)

\$ mingw-get install msys-mintty

之后,在桌面上建立指向”安装目录\msys\1.0\msys.bat —mintty”的快捷方式,以后我们都从这里直接启动命令行了。

2.生成各平台独立工具链

首先cd到NDK目录(我这里是android-ndk-r9c)/build/tools下,运行下面三行代码:

\$ make-standalone-toolchain.sh —platform=android-19 —system=windows-x86_64 —ndk-dir=/d/envcom/android-ndk-r9c —install-dir=/d/opensrc/arm-19-toolchain

\$ make-standalone-toolchain.sh —platform=android-19 —system=windows-x86_64 —ndk-dir=/d/envcom/android-ndk-r9c —install-dir=/d/opensrc/x86-19-toolchain —arch=x86

\$ make-standalone-toolchain.sh —platform=android-19 —system=windows-x86_64 —ndk-dir=/d/envcom/android-ndk-r9c —install-dir=/d/opensrc/mips-19-toolchain —arch=mips

注:/d/envcom/android-ndk-r9c 为NDK安装目录。

这样就生成了arm、x86、mips三个独立的工具链分别到arm-19-toolchain、x86-19-toolchain、mips-19-toolchain三个目录。

3.交叉编译ARM平台各项

1).设置环境变量PATH

编译arm平台下静态链接库前首先用下面的命令设置环境变量PATH:

\$ export PATH=.:/d/opensrc/arm-19-toolchain/bin:/usr/local/bin:/mingw/bin:/bin

这样,编译时查找各执行程序(编译程序gcc,g++,链接程序)会去这些目录下匹配。

2).设置环境变量INCLUDE_PATH

如果不设置头文件默认查找位置,mingw会到其安装目录的include文件夹下去匹配,而这是相当危险的。因为根据交叉编译的目标平台的不同,运行的指令集也不尽相同,那么头文件中的配置、参数对象构成也会不同。在交叉编译时如果头文件引用错误,configure或者make时都可能会发生异常。我们现在针对arm指令集就必须执行下面的命令:

\$ export C_INCLUDE_PATH=/d/opensrc/arm-19-toolchain/sysroot/usr/include

\$ export CPLUS_INCLUDE_PATH=/d/opensrc/arm-19-toolchain/sysroot/usr/include

尝试过在configure时使用 —with-sysroot=/d/opensrc/arm-19-toolchain/sysroot 来替换上面做法,但并不凑效

另外尝试将C_INCLUDE_PATH和CPLUS_INCLUDE_PATH配置直接附加到configure命令的末尾来替换上面做法,虽然最后列出的清单没有异常,但下一步make时会发生异常

3).交叉编译FFTW

首先cd到fftw源码目录下,configure项目。这里根据目标文件安装位置的不同,命令和配置也不相同。你可以选择直接安装到mingw环境(默认),供以后所有有需要的项目使用。也可以直接安装到ImageMagick的源码目录下的fftw处,只针对ImageMagick项目交叉编译使用。这里我两种方式都说明一下。

安装到MinGW环境的话,执行下面这几条命令:

\$ ./configure —host=arm-linux-androideabi —disable-shared

\$ make

\$ make install

另外还需改动下环境变量,告诉链接程序库文件和头文件显式引用位置

\$ export C_INCLUDE_PATH=/d/opensrc/arm-19-toolchain/sysroot/usr/include:/usr/local/include

\$ export LIBS=”-L/usr/local/lib”

安装到ImageMagick目录的话,则只需要执行下面这三条命令:

\$ ./configure —host=arm-linux-androideabi —disable-shared —prefix=/d/opensrc/imgic-6.8.8/fftw —libdir=/d/opensrc/imgic-6.8.8/fftw —includedir=/d/opensrc/imgic-6.8.8/fftw

\$ make

\$ make install

注:/d/opensrc/imgic-6.8.8为ImageMagick源码目录

这里需要说明下为什么要将fftw以及下面的jpeg、png项目生成的目标文件用上面这两种方式安装?无论是安装到MinGW环境还是ImageMagick目录,目的都是在交叉编译ImageMagick时让configure程序让发现fftw、jpeg、png,以让ImageMagick生成的目标文件是支持它们的。否则ImageMagick test failed,我们在安卓JNI开发时ImageMagick静态库就无法使用这类图片格式或者功能。

4).交叉编译libjpeg

首先cd到jpeg源码目录下,configure项目。整个过程与fftw交叉编译类似。不同的是,如果安装到MinGW环境的话,不再需要设置环境变量了,因为fftw编译完成时已经设置过了(注意fftw、jpeg、png只能一起选择同一种安装方式,不能两个项目的安装到的位置不同)。如果安装到ImageMagick目录的话,把目录名fftw换成jpeg即可。详细如下:

安装到MinGW环境:

\$ ./configure —host=arm-linux-androideabi —disable-shared

\$ make

\$ make install

安装到ImageMagick目录,则只需要执行下面这三条命令:

\$ ./configure —host=arm-linux-androideabi —disable-shared —prefix=/d/opensrc/imgic-6.8.8/jpeg —libdir=/d/opensrc/imgic-6.8.8/jpeg —includedir=/d/opensrc/imgic-6.8.8/jpeg

\$ make

\$ make install

5).交叉编译libpng

首先cd到png源码目录下,configure项目。整个过程同样与fftw交叉编译类似。如安装到ImageMagick目录,仅把目录名fftw换成png即可。

6).交叉编译ImageMagick

有了上面这些准备工作,交叉编译ImageMagick就容易很多了。

直接cd到ImageMagick源码目录,执行下面的命令:

\$ ./configure —host=arm-linux-androideabi —prefix=/d/opensrc/imgic-out —disable-shared —disable-opencl —disable-largefile —without-perl —without-x —disable-openmp —without-bzlib —without-freetype —without-rsvg —enable-delegate-build

如果你上面将fftw、jpeg、png安装到ImageMagick目录的话,一定要打开 —enable-delegate-build 这个开关。

这里我们关闭了一些用不到的开关,—prefix=/d/opensrc/imgic-out 将输出目录指定。敲进去之后,一杯咖啡的时间,你就会看到命令行生成了像下面这样的清单。

看着fftw、jpeg、png、imagemagick++都是yes,也就可以安心地继续往下执行make了,又是一杯咖啡的时间,就可以make install了。于是我们的第一个基于arm移动平台的ImageMagick静态链接库集合就大功告成。

4.交叉编译x86平台各项

交叉编译x86平台与交叉编译arm平台过程基本一致,不同的是中间一些目录和设置稍有不同

  • 在每个源码目录make前记得make clean
  • 把arm过程中所有命令出现的 arm-19-toolchain 替换成 x86-19-toolchain
  • 把arm过程中所有命令出现的 —host=arm-linux-androideabi 替换成 —host=i686-linux-android

5.交叉编译mips平台各项

交叉编译mips平台与交叉编译arm平台过程基本一致,不同的是中间一些目录和设置稍有不同

  • 在每个源码目录make前记得make clean
  • 把arm过程中所有命令出现的 arm-19-toolchain 替换成 mips-19-toolchain
  • 把arm过程中所有命令出现的 —host=arm-linux-androideabi 替换成 —host=mipsel-linux-android

至此,Android平台所有指令集架构下的静态链接库都交叉编译完成。这样我们就可以在JNI编码打包时将各静态库(.a文件)作为单独的MODULE引入使用了。

最终生成的目标文件集合包我也都放在了云盘处 http://yunpan.cn/Q7UxIiMiaDyXG (提取码:f297)。

Windows下将ImageMagick移植到Android平台的更多相关文章

  1. J2ME项目移植到Android平台六大注意事项

    很多J2ME项目如何移植到Android平台呢?Java虽然号称是跨平台应用但是目前的移植问题还是比较严重的,不知道未来Sun推出JavaFx或F3时会出现什么问题,如何从J2ME移植到Android ...

  2. 基于Cocos2d-x-1.0.1的飞机大战游戏迁移到Cocos2d-x-3.0版本,并移植到Android平台成功运行

    一.版本迁移中的问题 1.游戏元素Sprite.Label.Action等等的创建函数名都改为create. 2.函数的回调callfunc_selectorcallfuncN_selectorcal ...

  3. Unity3D之移植学习笔记:移植到Android平台更好的方法

    接上文,之前我们采用了直接将Unity项目导出为Eclipse项目来修改的方式,这种做法存在的一个最大的问题就是:每当Unity被修改之后,都需要重新导出,而每次导出的项目在Android平台方面的J ...

  4. windows下使用adb工具查看android程序cpu和内存消耗情况

    在实际的开发当中,尤其软件运行在一个硬件设备比较差的环境下,对软件占用资源大的问题是开发者们必须要解决的问题,系统比较卡.觉得应该看看程序的cpu和内存消耗 一直以来都在windows下编程,已经习惯 ...

  5. Cocos2d-x游戏移植到Android平台

    1.所需环境支持:Android SDK.NDK.Eclipse.Cygwin.(本人所用系统WIN7-64位) (1)Cygwin的下载安装: Cygwin是Windows下的Linux模拟环境,用 ...

  6. Unity3D之移植学习笔记:移植到Android平台

    首先,我们需要一台已经配置好可以开发Android应用的计算机,这里我使用的是Windows系统+Eclipse+ADT的开发环境,当然也可以使用Android Studio或者使用Mac系统都可以. ...

  7. 将 FFmpeg 移植到 Android平台 (完整版)

    首先需要去FFmpeg的官网http://www.ffmpeg.org/去下载FFmpeg的源码,目前的版本号为FFmpeg3.3(Hilbert). 下载的文件为压缩包,解压后得到ffmpeg-3. ...

  8. FFmpeg 学习(三):将 FFmpeg 移植到 Android平台

    首先需要去FFmpeg的官网http://www.ffmpeg.org/去下载FFmpeg的源码,目前的版本号为FFmpeg3.3(Hilbert). 下载的文件为压缩包,解压后得到ffmpeg-3. ...

  9. 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73253044 前言 安防互联网化的需求已经越 ...

随机推荐

  1. GetLastError() 返回值含义

    [0]-操作成功完成.[1]-功能错误.[2]-系统找不到指定的文件.[3]-系统找不到指定的路径.[4]-系统无法打开文件.[5]-拒绝访问.[6]-句柄无效.[7]-存储控制块被损坏.[8]-存储 ...

  2. 38.利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) 此方法要求能够:1.用传递过来的对象调用comp

    //接口Compute package jieKou; public interface Compute { int Computer(int n,int m); } //加 package jieK ...

  3. C# html转mht

    项目中引入cdosys.dll组件,位置:  C:\Windows\System32\cdosys.dll CDO.ADODB 这些类都来自于cdosys.dll组件 /// <summary& ...

  4. 通过httplib2 探索的学习的最佳方式

    在工作中需要对一个视频点播两百次,使其成为热门视频,才能对其p2p情况进行测试.虽然可以手动点播两百次,但是利用python发送200次post请求,能减少很多的工作量.该发送请求的方法用到了http ...

  5. windows xp sp3 下载地址

      windows xp service pack 3/ windows xp sp3 简体中文版下载地址: http://download.windowsupdate.com/msdownload/ ...

  6. Windows kernel pool 初探(2014.12)

    Windows kernel pool 1. 简介 Kernel pool类似于Windows用户层所使用Heap,其为内核组件提供系统资源.在系统初始化的时候,内存管理模块就创建了pool. 严格的 ...

  7. iOS的一些关键字

    最近在使用Swift的过程中,感觉到苹果公司为了迎合Swift,在Objective-C中添加了许多关键字.这些关键字一般用来用来修饰属性,或者方法的参数以及方法的返回值等等.而在以前的Objecti ...

  8. POJ 1696 Space Ant 极角排序(叉积的应用)

    题目大意:给出n个点的编号和坐标,按逆时针方向连接着n个点,按连接的先后顺序输出每个点的编号. 题目思路:Cross(a,b)表示a,b的叉积,若小于0:a在b的逆时针方向,若大于0a在b的顺时针方向 ...

  9. 七、oracle 表查询二

    1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or ...

  10. Footer固定在页面底部(CSS)

    <style type="text/css"> #wapper{ position: relative; /*重要!保证footer是相对于wapper位置绝对*/ h ...