【Android 內存優化】libjpeg-turbo 函數庫交叉編譯 ( libjpeg-turbo 函數庫下載 | libjpeg-turbo 編譯文檔 | 環境準備 | NASM 安裝 )





一、 libjpeg-turbo 函數庫下載與解壓



在上一篇博客 【Android 內存優化】Android 原生 API 圖片壓縮原理 ( 哈夫曼編碼開關 | 哈夫曼編碼原理 | libjpeg-turbo 函數庫 ) 對哈夫曼編碼進行了介紹 , 如果需要在所有的 Android 手機上使用哈夫曼編碼壓縮圖片, 那就需要使用 libjpeg-turbo 函數庫 , 從 libjpeg-turbo/libjpeg-turbo GitHub 項目的 Release 發佈版本頁面 下載 Release 版本的源碼 , 這裏下載最新的 Source code (tar.gz) 源碼 ;


拷貝源碼到 Ubuntu : 源碼下載完畢後 , 將源碼 libjpeg-turbo-2.0.5.tar.gz 拷貝到 Ubuntu 虛擬機中 , 在 /root/ 目錄下創建 picture_compress 目錄 , 將源碼拷貝到該目錄下 ;

在這裏插入圖片描述

解壓源碼 : 執行 tar xvf libjpeg-turbo-2.0.5.tar.gz 命令 , 解壓 libjpeg-turbo 函數庫源碼 ;

$ tar xvf libjpeg-turbo-2.0.5.tar.gz

在這裏插入圖片描述





二、 libjpeg-turbo 編譯文檔



編譯文檔 :


查看 libjpeg-turbo 函數庫的 ReadMe 信息 , 查找如何編譯該函數庫 ;

官方提示 , 讓我們查看 BUILDING.md 文件 , 裏面有詳細的編譯文檔 ; ( 可以點擊該鏈接 , 直接跳轉查看該文件 )

在這裏插入圖片描述





三、 編譯前環境準備



BUILDING.md 中提供了編譯指導 , 在 Build Requirements 中說明了編譯前應該準備好的環境 ;


編譯前環境準備 :


① CMake 工具 : 安裝 2.8.12 以上的 CMake 工具 ;

② 彙編工具 : 安裝 NASM or YASM 工具 , 建議使用 2.10 版本以上的 NASM 工具 ;

④ GCC 編譯器 : 4.1 以上的 GCC 工具 , 這裏交叉編譯使用 NDK 中的 GCC 工具即可 ;

⑤ JDK 工具 : 1.5 以上的 JDK , 用於生成 Java 調用庫 , 此處只需要編譯 C 語言部分即可 ;





四、 安裝 NASM 彙編工具





1、 下載 NASM 彙編工具


下載 NASM 彙編工具 :


編譯需要安裝 NASM 或者 YASM , 這是彙編工具 ;

NASM 下載地址 : http://www.nasm.us/pub/nasm/releasebuilds

選擇最新的發佈版本 : 2.15 版本 , 昨天剛發佈的 ;

在這裏插入圖片描述

https://www.nasm.us/pub/nasm/releasebuilds/2.15/ 頁面下載 nasm-2.15.tar.gz 壓縮包 ; 也可以直接點擊 此處連接下載 ;
在這裏插入圖片描述



2、 拷貝解壓 NASM 源碼


拷貝文件 : 將該文件拷貝到 Ubuntu 系統中的 /root/picture_compress 目錄中 ;

解壓該文件 : 調用 tar xvf nasm-2.15.tar.gz 命令 , 解壓該文件 ;

$ tar xvf nasm-2.15.tar.gz

在這裏插入圖片描述

該目錄中的文件情況 :libjpeg-turbo-2.0.5 , libjpeg-turbo-2.0.5.tar.gz , nasm-2.15 , nasm-2.15.tar.gz 四個文件或目錄 ;

root@octopus:~/picture_compress# ls
libjpeg-turbo-2.0.5  libjpeg-turbo-2.0.5.tar.gz  nasm-2.15  nasm-2.15.tar.gz
root@octopus:~/picture_compress# 


3、 編譯安裝 nasm-2.15


編譯 nasm-2.15 :


① 生成 Makefile 文件 : 進入 nasm-2.15 目錄 , 執行 ./configure 命令 , 先生成 Makefile 文件 ;

$ ./configure

執行上述命令 , 最終會生成 Makefile 文件 ;

root@octopus:~/picture_compress/nasm-2.15# ./configure 
checking for prefix by checking for nasm... no
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for gcc... gcc

// ... 省略一萬行 

checking if gcc supports C99 external inlines... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating doc/Makefile
config.status: creating config/config.h
root@octopus:~/picture_compress/nasm-2.15# 

② 編譯安裝 : 在/root/picture_compress/nasm-2.15 目錄下執行 make install 命令 , 編譯安裝 nasm-2.15 彙編工具 ;

$ make install

編譯完成後 , 該工具即可使用 ;

root@octopus:~/picture_compress/nasm-2.15# make install
gcc -c  -g -O2 -fwrapv -U__STRICT_ANSI__ -fno-common -Werror=attributes -ffunction-sections -fdata-sections -fvisibility=hidden -Wall -W -pedantic -Wc90-c99-compat -Wno-long-long -Wno-shift-negative-value -Werror=implicit -Werror=missing-braces -Werror=return-type -Werror=trigraphs -Werror=pointer-arith -Werror=missing-prototypes -Werror=missing-declarations -Werror=comment -Werror=vla -DHAVE_CONFIG_H -I. -I. -I./include -I./include -I./x86 -I./x86 -I./asm -I./asm -I./disasm -I./disasm -I./output -I./output -o asm/nasm.o asm/nasm.c

// 省略 ...

I./output -I./output -Wl,--gc-sections -o ndisasm disasm/ndisasm.o libnasm.a 
/bin/mkdir -p /usr/local/bin
/usr/bin/install -c nasm /usr/local/bin/nasm
/usr/bin/install -c ndisasm /usr/local/bin/ndisasm
/bin/mkdir -p /usr/local/share/man/man1
/usr/bin/install -c -m 644 ./nasm.1 /usr/local/share/man/man1/nasm.1
/usr/bin/install -c -m 644 ./ndisasm.1 /usr/local/share/man/man1/ndisasm.1
root@octopus:~/picture_compress/nasm-2.15# 


下面的操作在老版本中才需要 , 新版本 , 不需要執行下面的操作 ; ( 非必要操作 , 僅做參考 )

安裝 autoconf 工具 :

$ sudo apt install autoconf

進入 /root/picture_compress/libjpeg-turbo-xxx 目錄 , 執行 autoreconf -fiv 命令 ;

$ autoreconf -fiv




五、 編譯 Android 平臺使用的 libjpeg-turbo 函數庫參考 ( 官方提供 | 僅供參考 )



NDK 要求 : Android NDK , 必須使用 v13b 以上的版本 ;

下方的配置來源與 https://github.com/libjpeg-turbo/libjpeg-turbo/blame/master/BUILDING.md ;


下面的編譯腳本僅做參考 , 實際編譯時還是使用之前熟悉的 configure 配置生成 Makefile 文件 ; 這裏僅參考其中的配置信息 ;



1、ARMv7 (32-bit)


交叉編譯通用腳本 , 編譯 ARMv7 (32-bit) CPU 架構函數庫 ;

    # Set these variables to suit your needs
    NDK_PATH={full path to the NDK directory-- for example,
      /opt/android/android-ndk-r16b}
    TOOLCHAIN={"gcc" or "clang"-- "gcc" must be used with NDK r16b and earlier,
      and "clang" must be used with NDK r17c and later}
    ANDROID_VERSION={the minimum version of Android to support-- for example,
      "16", "19", etc.}

    cd {build_directory}
    cmake -G"Unix Makefiles" \
      -DANDROID_ABI=armeabi-v7a \
      -DANDROID_ARM_MODE=arm \
      -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
      -DANDROID_TOOLCHAIN=${TOOLCHAIN} \
      -DCMAKE_ASM_FLAGS="--target=arm-linux-androideabi${ANDROID_VERSION}" \
      -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
      [additional CMake flags] {source_directory}
    make


2、ARMv8 (64-bit)


交叉編譯通用腳本 , 編譯 ARMv8 (64-bit) CPU 架構函數庫 ;

    # Set these variables to suit your needs
    NDK_PATH={full path to the NDK directory-- for example,
      /opt/android/android-ndk-r16b}
    TOOLCHAIN={"gcc" or "clang"-- "gcc" must be used with NDK r14b and earlier,
      and "clang" must be used with NDK r17c and later}
    ANDROID_VERSION={the minimum version of Android to support.  "21" or later
      is required for a 64-bit build.}

    cd {build_directory}
    cmake -G"Unix Makefiles" \
      -DANDROID_ABI=arm64-v8a \
      -DANDROID_ARM_MODE=arm \
      -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
      -DANDROID_TOOLCHAIN=${TOOLCHAIN} \
      -DCMAKE_ASM_FLAGS="--target=aarch64-linux-android${ANDROID_VERSION}" \
      -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
      [additional CMake flags] {source_directory}
    make


3、x86 (32-bit)


交叉編譯通用腳本 , 編譯 x86 (32-bit) CPU 架構函數庫 ;

    # Set these variables to suit your needs
    NDK_PATH={full path to the NDK directory-- for example,
      /opt/android/android-ndk-r16b}
    TOOLCHAIN={"gcc" or "clang"-- "gcc" must be used with NDK r14b and earlier,
      and "clang" must be used with NDK r17c and later}
    ANDROID_VERSION={The minimum version of Android to support-- for example,
      "16", "19", etc.}

    cd {build_directory}
    cmake -G"Unix Makefiles" \
      -DANDROID_ABI=x86 \
      -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
      -DANDROID_TOOLCHAIN=${TOOLCHAIN} \
      -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
      [additional CMake flags] {source_directory}
    make


4、x86-64 (64-bit)


交叉編譯通用腳本 , 編譯 x86-64 (64-bit) CPU 架構函數庫 ;

    # Set these variables to suit your needs
    NDK_PATH={full path to the NDK directory-- for example,
      /opt/android/android-ndk-r16b}
    TOOLCHAIN={"gcc" or "clang"-- "gcc" must be used with NDK r14b and earlier,
      and "clang" must be used with NDK r17c and later}
    ANDROID_VERSION={the minimum version of Android to support.  "21" or later
      is required for a 64-bit build.}

    cd {build_directory}
    cmake -G"Unix Makefiles" \
      -DANDROID_ABI=x86_64 \
      -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
      -DANDROID_TOOLCHAIN=${TOOLCHAIN} \
      -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
      [additional CMake flags] {source_directory}
    make
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章