编译Android环境的libjpeg-turbo

注意
  这篇是针对1.5.x版本的编译,比较复杂。当前最新版本2.0.1使用CMake编译,最好下载最新版本,参照我的这篇文章编译编译Android环境的libjpeg-turbo使用cmake

1、libjpeg 和 libjpeg-turbo

为了在Android环境实现无损压缩或者我们为了实现更高性能的jpeg图像压缩,我们需要使用到libjpeg-turbo[1]
官网上已说, libjpeg-turbo is generally 2-6x as fast as libjpeg。所以,一般我们选用libjpeg-turbo而不是libjpeg,因为前者快后者2-6

2、编译过程

2.1 下载源码

  1. 我们需要先下载libjpeg-turbo[2]的源码
  2. 下载了源码之后,找到源码里的BUILDING.md文件,我们将依照官方说明来进行编译安装

2.2 系统环境

编译之前我们需要准备配置好编译环境(Linux):

  1. Windows——需要Linux环境,可以使用cygwin
  2. Linux——Ubuntu或者其它的Linux系统

这里我使用了在Windows上通过虚拟机安装的Ubuntu来编译

image.png

注意 1
: 切记,在Windows上使用cygwin,不能使用Windows环境的NDK,否则会编译失败。我们需要在Linux环境下编译,所以一定要使用Linux环境下的NDK。

2.3 编译环境

我这里选用的Ubuntu来编译,所以以下的编译过程都是在Ubuntu下操作

2.3.1 NDK

  1. 下载Linux环境的NDK[3]
Linux 64位NDK

2.3.2 安装需要的工具

编译libjpeg-tubro需要一系列工具,需要首先安装配置好.比如:autoconf、automake、libtool、m4、nasm

下载地址:

  1. m4
  2. autoconf
  3. automake
  4. libtool
  5. nasm
  • 安装有依赖关系,最好按照以上的顺序安装,autoconf依赖m4
  • 如果需要编译x86的库,需要安装nasm

下载完成后,安装(Linux系统安装大致都是如此):

tar -xzvf   *.gz      //解压
cd dir                //切换到解压目录

./configure
make
sudo make install      //有需要的输入系统登录账户密码

检验是否安装成功,比如,aoutomake,终端定位到安装目录,执行
make --version
查看安装版本

我们安装的工具如下:

需要的安装

2.3.3 配置系统环境变量

把以上的安装都配置到系统环境变量里,方便我们在终端使用

在终端输入:
sudo gedit /etc/environment
PATH='……'后面加入":我们安装的路径",注意路径前面有冒号 :

系统环境变量

编辑完后,点击save保存并关闭,然后执行
source /etc/environment
使之立即生效

2.4 编译

下载并解压源码[2]

2.4.1 生成配置脚本

在终端依次输入下列command

cd {source_directory}  #定位到源文件解压目录 source_dir
autoreconf -fiv        #执行自动配置,生成配置脚本文件 configure

2.4.2 编写编译脚本

  1. 我们为了编译目录和源码目录分开,在源码目录的同级目录创建编译目录

    #cd 到源码目录的同级目录
    mkdir libjpeg   #这个目录和编译脚本第一行cd到的目录对应
    
  2. make install编译安装成功之后可以通过make distclean清除编译结果。

  3. 以下脚本使用Android NDK 独立工具链[4] 请参照
    https://developer.android.google.cn/ndk/guides/standalone_toolchain

2.4.2.1 armeabi-v7a.sh

cd libjpeg

NDK_PATH=/home/as/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} -Os -fPIE" \
   CPPFLAGS="${ANDROID_CFLAGS}" \
   LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"} --with-jpeg8 \
   --prefix=/home/as/Documents/dist/libjpeg-turbo/armeabi-v7a/

make
sudo make install
# --exec-prefix=/home/as/Documents/dist/ex/ --enable-shared --enable-static
  

2.4.2.2 arm64-v8a.sh

cd libjpeg

NDK_PATH=/home/as/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} -Os -fPIE" \
   CPPFLAGS="${ANDROID_CFLAGS}" \
   LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"} --with-jpeg8 \
   --prefix=/home/as/Documents/dist/libjpeg-turbo/

make
sudo make install
# --exec-prefix=/home/as/Documents/dist/ex/ --enable-shared --enable-static

2.4.2.3 x86.sh

cd libjpeg

NDK_PATH=/home/as/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} -Os -fPIE" \
   CPPFLAGS="${ANDROID_CFLAGS}" \
   LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"} --with-jpeg8 \
   --prefix=/home/as/Documents/dist/libjpeg-turbo/x86/

make
sudo make install
# --exec-prefix=/home/as/Documents/dist/ex/ --enable-shared --enable-static

2.4.2.4 x86_64.sh

cd libjpeg

NDK_PATH=/home/as/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} -Os -fPIE" \
   CPPFLAGS="${ANDROID_CFLAGS}" \
   LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"} --with-jpeg8 \
   --prefix=/home/as/Documents/dist/libjpeg-turbo/x86-64/

make
sudo make install
# --exec-prefix=/home/as/Documents/dist/ex/ --enable-shared --enable-static

2.4.3 编译

以上脚本需要根据你的源码目录,NDK目录,修改相应的路径,--prefix指定编译的安装目录,就是最终的库存放位置

在终端里执行以上脚本
sh ./armeabi-v7a.sh
编译结果可以通过make distclean清除

目录结构
编译安装目录

3、使用

至于使用网上已经有很多介绍,这里不再赘述,Android平台通过JNI或者在native层直接使用就可以了。


  1. libjpeg-turbo地址

  2. libjpeg-turbo Github下载地址

  3. Linux NDK下载

  4. Android NDK 附带的工具链

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容