导航
导航
文章目录
  1. 引言
  2. 源码
  3. 编译环境搭建
    1. 系统平台
    2. 编译准备
      1. NDK
      2. 必要软件
      3. 配置系统环境变量
    3. 编译流程

编译libjpeg-turbo

引言

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

必要软件
  1. m4 (下载最新的gz文件)
  2. autoconf (下载最新的gz文件)
  3. automake (下载最新的gz文件)
  4. libtool (下载最新的gz文件)
  5. 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/