注意
??這篇是針對(duì)1.5.x版本的編譯,比較復(fù)雜。當(dāng)前最新版本2.0.1使用CMake編譯,最好下載最新版本,參照我的這篇文章編譯編譯Android環(huán)境的libjpeg-turbo使用cmake
1、libjpeg 和 libjpeg-turbo
為了在Android環(huán)境實(shí)現(xiàn)無(wú)損壓縮或者我們?yōu)榱藢?shí)現(xiàn)更高性能的jpeg圖像壓縮,我們需要使用到libjpeg-turbo[1]。
官網(wǎng)上已說(shuō), libjpeg-turbo is generally 2-6x as fast as libjpeg。所以,一般我們選用libjpeg-turbo而不是libjpeg,因?yàn)榍罢呖旌笳?strong>2-6倍
2、編譯過(guò)程
2.1 下載源碼
- 我們需要先下載libjpeg-turbo[2]的源碼
- 下載了源碼之后,找到源碼里的
BUILDING.md文件,我們將依照官方說(shuō)明來(lái)進(jìn)行編譯安裝
2.2 系統(tǒng)環(huán)境
編譯之前我們需要準(zhǔn)備配置好編譯環(huán)境(Linux):
- Windows——需要Linux環(huán)境,可以使用cygwin
- Linux——Ubuntu或者其它的Linux系統(tǒng)
這里我使用了在Windows上通過(guò)虛擬機(jī)安裝的Ubuntu來(lái)編譯

注意 1
: 切記,在Windows上使用cygwin,不能使用Windows環(huán)境的NDK,否則會(huì)編譯失敗。我們需要在Linux環(huán)境下編譯,所以一定要使用Linux環(huán)境下的NDK。
2.3 編譯環(huán)境
我這里選用的Ubuntu來(lái)編譯,所以以下的編譯過(guò)程都是在Ubuntu下操作
2.3.1 NDK

2.3.2 安裝需要的工具
編譯libjpeg-tubro需要一系列工具,需要首先安裝配置好.比如:autoconf、automake、libtool、m4、nasm
下載地址:
- 安裝有依賴(lài)關(guān)系,最好按照以上的順序安裝,
autoconf依賴(lài)m4 - 如果需要編譯
x86的庫(kù),需要安裝nasm
下載完成后,安裝(Linux系統(tǒng)安裝大致都是如此):
tar -xzvf *.gz //解壓
cd dir //切換到解壓目錄
./configure
make
sudo make install //有需要的輸入系統(tǒng)登錄賬戶(hù)密碼
檢驗(yàn)是否安裝成功,比如,aoutomake,終端定位到安裝目錄,執(zhí)行
make --version
查看安裝版本
我們安裝的工具如下:

2.3.3 配置系統(tǒng)環(huán)境變量
把以上的安裝都配置到系統(tǒng)環(huán)境變量里,方便我們?cè)诮K端使用
在終端輸入:
sudo gedit /etc/environment
在PATH='……'后面加入":我們安裝的路徑",注意路徑前面有冒號(hào) :

編輯完后,點(diǎn)擊save保存并關(guān)閉,然后執(zhí)行
source /etc/environment使之立即生效
2.4 編譯
下載并解壓源碼[2]
2.4.1 生成配置腳本
在終端依次輸入下列command
cd {source_directory} #定位到源文件解壓目錄 source_dir
autoreconf -fiv #執(zhí)行自動(dòng)配置,生成配置腳本文件 configure
2.4.2 編寫(xiě)編譯腳本
-
我們?yōu)榱司幾g目錄和源碼目錄分開(kāi),在源碼目錄的同級(jí)目錄創(chuàng)建編譯目錄
#cd 到源碼目錄的同級(jí)目錄 mkdir libjpeg #這個(gè)目錄和編譯腳本第一行cd到的目錄對(duì)應(yīng) make install編譯安裝成功之后可以通過(guò)make distclean清除編譯結(jié)果。以下腳本使用Android NDK 獨(dú)立工具鏈[4]?請(qǐng)參照
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 編譯
以上腳本需要根據(jù)你的源碼目錄,NDK目錄,修改相應(yīng)的路徑,--prefix指定編譯的安裝目錄,就是最終的庫(kù)存放位置
在終端里執(zhí)行以上腳本
sh ./armeabi-v7a.sh
編譯結(jié)果可以通過(guò)make distclean清除


3、使用
至于使用網(wǎng)上已經(jīng)有很多介紹,這里不再贅述,Android平臺(tái)通過(guò)JNI或者在native層直接使用就可以了。