编译Android环境的libjpeg-turbo

作者: 一林花色 | 来源:发表于2017-10-25 13:45 被阅读1621次

    注意
      这篇是针对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 附带的工具链

    相关文章

      网友评论

        本文标题:编译Android环境的libjpeg-turbo

        本文链接:https://www.haomeiwen.com/subject/duhqpxtx.html