引言
Android使用java语言开发,虽然java越来越好,但是涉及到性能方面依然都是普遍的C/C++。本次我们说说Android中图片压缩,关于Android中的图片压缩使用场景太多了,最简单的从相册选择一张图片显示到屏幕,肯定要经过压缩,压缩方式有多种,java层就有质量压缩,尺寸压缩,采样压缩,Mtrix压缩等。一定程度上都能满足需求。追求极致性能的那就要考虑C层的压缩了,LibJpeg
是图片处理方面很出名的库,也衍生了LibJpegTurbo
库,用于Android平台。网上搜索基本上都能搜到相关的编译好的so文件,基本上都是差不多的文章,so文件只有armeabi
,armeabi-v7a
两个架构,想找x86版本的,地翻过来都没有找到。咋办,自己编呗。。
源码
https://libjpeg-turbo.org/
编译环境搭建
系统平台
Linux
不满足条件的安装VMWare虚拟机,本人也是安装虚拟机来搭建平台,安装乌班图系统即可

编译准备
NDK
编译so文件自然少不了NDK,一定要Linux平台的NDK,下载地址android-ndk-r15c-linux-x86_64.zip
必要软件
- m4 (下载最新的gz文件)
- autoconf (下载最新的gz文件)
- automake (下载最新的gz文件)
- libtool (下载最新的gz文件)
- nasm (下载最新的gz文件,此库是编译x86架构so必须的)
由于个别软件之间有依赖关系,最好按照以上顺序来安装
下载好后,逐个进行安装,
tar -xzvf *.gz //解压
cd dir //切换到解压目录
./configure
make
sudo make install //有需要的输入系统登录账户密码
检验是否安装成功,比如automake,终端定位到安装目录,执行
automake --version
正常显示版本表示安装成功
安全全部软件如图:

配置系统环境变量
将上面安装的软件配置到环境变量中
sudo gedit /etc/environment
打开配置文件,在PATH='……'
后面加入":我们安装的路径"
,注意路径前面有冒号:

编辑完后,点击save保存并关闭,然后执行
source /etc/environment
使之立即生效
编译流程
新建一个目录,存放libjpeg源码,这里我们取名source
在source
目录中新建一个目录用于存放编译文件,这里我们取名libjpeg
在source
目录中新建一个目录用于存放编译成功后生成的so文件等,这里我们取名dist
编写编译脚本文件:
armeabi_v7a.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| cd libjpeg
NDK_PATH=/home/robin/Android/android-ndk-r15c
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=21
HOST=arm-linux-androideabi
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm
ANDROID_CFLAGS="-march=armv7-a -mfloat-abi=softfp -fprefetch-loop-arrays -mfpu=neon -mthumb -D__ANDROID__ -D__ARM_ARCH_7__ \
--sysroot=${SYSROOT}"
TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
export CPP=${TOOLCHAIN}/bin/${HOST}-cpp
export AR=${TOOLCHAIN}/bin/${HOST}-ar
export NM=${TOOLCHAIN}/bin/${HOST}-nm
export CC=${TOOLCHAIN}/bin/${HOST}-gcc
export LD=${TOOLCHAIN}/bin/${HOST}-ld
export RANLIB=${TOOLCHAIN}/bin/${HOST}-ranlib
export OBJDUMP=${TOOLCHAIN}/bin/${HOST}-objdump
export STRIP=${TOOLCHAIN}/bin/${HOST}-strip
sh ../libjpeg-turbo-master/configure --host=${HOST} \
CFLAGS="${ANDROID_CFLAGS} -O3 -fPIE" \
CPPFLAGS="${ANDROID_CFLAGS}" \
LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"} --with-jpeg8 \
--prefix=/home/robin/source/dist/libjpeg-turbo/armeabi-v7a/
make
sudo make install
|
arm64_v8a.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| cd libjpeg
NDK_PATH=/home/robin/Android/android-ndk-r15c
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=21
HOST=aarch64-linux-android
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm64
ANDROID_CFLAGS="--sysroot=${SYSROOT}"
TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
export CPP=${TOOLCHAIN}/bin/${HOST}-cpp
export AR=${TOOLCHAIN}/bin/${HOST}-ar
export NM=${TOOLCHAIN}/bin/${HOST}-nm
export CC=${TOOLCHAIN}/bin/${HOST}-gcc
export LD=${TOOLCHAIN}/bin/${HOST}-ld
export RANLIB=${TOOLCHAIN}/bin/${HOST}-ranlib
export OBJDUMP=${TOOLCHAIN}/bin/${HOST}-objdump
export STRIP=${TOOLCHAIN}/bin/${HOST}-strip
sh ../libjpeg-turbo-master/configure --host=${HOST} \
CFLAGS="${ANDROID_CFLAGS} -O3 -fPIE" \
CPPFLAGS="${ANDROID_CFLAGS}" \
LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"} --with-jpeg8 \
--prefix=/home/robin/source/dist/libjpeg-turbo/arm64-v8a/
make
sudo make install
|
x86.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| cd libjpeg
NDK_PATH=/home/robin/Android/android-ndk-r15c
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=21
HOST=i686-linux-android
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-x86
ANDROID_CFLAGS="--sysroot=${SYSROOT}"
TOOLCHAIN=${NDK_PATH}/toolchains/x86-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
export CPP=${TOOLCHAIN}/bin/${HOST}-cpp
export AR=${TOOLCHAIN}/bin/${HOST}-ar
export NM=${TOOLCHAIN}/bin/${HOST}-nm
export CC=${TOOLCHAIN}/bin/${HOST}-gcc
export LD=${TOOLCHAIN}/bin/${HOST}-ld
export RANLIB=${TOOLCHAIN}/bin/${HOST}-ranlib
export OBJDUMP=${TOOLCHAIN}/bin/${HOST}-objdump
export STRIP=${TOOLCHAIN}/bin/${HOST}-strip
sh ../libjpeg-turbo-master/configure --host=${HOST} \
CFLAGS="${ANDROID_CFLAGS} -O3 -fPIE" \
CPPFLAGS="${ANDROID_CFLAGS}" \
LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"} --with-jpeg8 \
--prefix=/home/robin/source/dist/libjpeg-turbo/x86/
make
sudo make install
|
x86_64.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| cd libjpeg
NDK_PATH=/home/robin/Android/android-ndk-r15c
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=21
HOST=x86_64-linux-android
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-x86_64
ANDROID_CFLAGS="--sysroot=${SYSROOT}"
TOOLCHAIN=${NDK_PATH}/toolchains/x86_64-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
export CPP=${TOOLCHAIN}/bin/${HOST}-cpp
export AR=${TOOLCHAIN}/bin/${HOST}-ar
export NM=${TOOLCHAIN}/bin/${HOST}-nm
export CC=${TOOLCHAIN}/bin/${HOST}-gcc
export LD=${TOOLCHAIN}/bin/${HOST}-ld
export RANLIB=${TOOLCHAIN}/bin/${HOST}-ranlib
export OBJDUMP=${TOOLCHAIN}/bin/${HOST}-objdump
export STRIP=${TOOLCHAIN}/bin/${HOST}-strip
sh ../libjpeg-turbo-master/configure --host=${HOST} \
CFLAGS="${ANDROID_CFLAGS} -O3 -fPIE" \
CPPFLAGS="${ANDROID_CFLAGS}" \
LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"} --with-jpeg8 \
--prefix=/home/robin/source/dist/libjpeg-turbo/x86-64/
make
sudo make install
|
以上脚本需要根据你的源码目录,NDK目录,修改相应的路径,–prefix指定编译的安装目录,就是最终的库存放位置
在终端里执行以上脚本sh ./armeabi-v7a.sh
编译一种架构后,可以通过make distclean
清除上一次编译结果,如果出错,手动删除libjpeg目录下文件即可
如果sh文件执行不了,例如提示cd命令错误,这是由于文件中存在的一些空格编码,造成的,需要用以下命令进行转码下,生成新文件
tr -d '\r' < start.sh > fixed.sh
,然后执行新的sh文件即可

我们的编译成果

转载请指明出处RobinBlog:http://robinx.net/2018/01/30/编译libjpeg-turbo/