編譯Android環(huán)境的libjpeg-turbo

注意
??這篇是針對(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 下載源碼

  1. 我們需要先下載libjpeg-turbo[2]的源碼
  2. 下載了源碼之后,找到源碼里的BUILDING.md文件,我們將依照官方說(shuō)明來(lái)進(jìn)行編譯安裝

2.2 系統(tǒng)環(huán)境

編譯之前我們需要準(zhǔn)備配置好編譯環(huán)境(Linux):

  1. Windows——需要Linux環(huán)境,可以使用cygwin
  2. Linux——Ubuntu或者其它的Linux系統(tǒng)

這里我使用了在Windows上通過(guò)虛擬機(jī)安裝的Ubuntu來(lái)編譯

image.png

注意 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

  1. 下載Linux環(huán)境的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
  • 安裝有依賴(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) :

系統(tǒng)環(huán)境變量

編輯完后,點(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ě)編譯腳本

  1. 我們?yōu)榱司幾g目錄和源碼目錄分開(kāi),在源碼目錄的同級(jí)目錄創(chuàng)建編譯目錄

    #cd 到源碼目錄的同級(jí)目錄
    mkdir libjpeg   #這個(gè)目錄和編譯腳本第一行cd到的目錄對(duì)應(yīng)
    
  2. make install編譯安裝成功之后可以通過(guò)make distclean清除編譯結(jié)果。

  3. 以下腳本使用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清除

目錄結(jié)構(gòu)
編譯安裝目錄

3、使用

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


  1. libjpeg-turbo地址 ?

  2. libjpeg-turbo Github下載地址 ? ?

  3. Linux NDK下載 ?

  4. Android NDK 附帶的工具鏈 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容