1. 程式人生 > >編譯Android環境的libjpeg-turbo使用cmake

編譯Android環境的libjpeg-turbo使用cmake

1. libjpeg-turbo

  前面已經編譯過1.5.91版本的libjpeg-turbo,現在版本升級到2.0.1,基於CMake編譯。

  依然還是一樣,按照官網介紹,libjpeg-turbolibjpeg2-6倍,得益於它高度優化的哈夫曼演算法。在許多情況下,libjpeg-turbo的效能可與專有的高速JPEG編解碼器相媲美.

On such systems, libjpeg-turbo is generally 2-6x as fast as libjpeg, all else being equal. On other types of systems, libjpeg-turbo can still outperform libjpeg by a significant amount, by virtue of its highly-optimized Huffman coding routines. In many cases, the performance of libjpeg-turbo rivals that of proprietary high-speed JPEG codecs

2. 編譯過程

2.1 編譯環境

在Windows 10的虛擬機器VM上的Ubuntu中編譯
vm_Ubuntu

2.2 編譯要求

我們將參照原始碼中的BUILDING.md編譯,github地址BUILDING.md

安裝工具

2.3 配置環境變數

把Cmake配置進系統環境變數,當然這不是必須的。
cmake環境變數

2.4 編譯

2.4.1 下載原始碼

2.4.2 編譯指令碼

2.4.2.1 sh編譯指令碼(自定義編譯鏈)

注意
這種方式是完全按照原始碼中的BUILDING.md構建,稍顯複雜,容易出錯。但是不要求CMake的交叉編譯工具鏈,也就是說,我們隨便在CMake官網下載Linux版本就可以用了。
#!/bin/sh
# lib-name MY_LIBS_NAME=libjpeg-turbo MY_SOURCE_DIR=$(pwd)/libjpeg-turbo-master #編譯的過程中產生的中介軟體的存放目錄,為了區分編譯目錄,原始碼目錄,install目錄 MY_BUILD_DIR=binary export PATH=/home/as/Android/cmake-3.12.1-Linux-x86_64/bin:$PATH NDK_PATH=/home/as/Android/android-ndk-r15c BUILD_PLATFORM=linux-x86_64 TOOLCHAIN_VERSION=4.9 ANDROID_VERSION=
24 ANDROID_ARMV5_CFLAGS="-march=armv5te" ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" # -mfpu=vfpv3-d16 -fexceptions -frtti ANDROID_ARMV8_CFLAGS="-march=armv8-a" # -mfloat-abi=softfp -mfpu=neon -fexceptions -frtti ANDROID_X86_CFLAGS="-march=i386 -mtune=intel -mssse3 -mfpmath=sse -m32" ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel" # params($1:arch,$2:arch_abi,$3:host,$4:compiler,$5:cflags,$6:processor) build_bin() { echo "-------------------star build $2-------------------------" ARCH=$1 # arm arm64 x86 x86_64 ANDROID_ARCH_ABI=$2 # armeabi armeabi-v7a x86 mips # 最終編譯的安裝目錄 PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/ HOST=$3 COMPILER=$4 PROCESSOR=$6 SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ARCH} CFALGS="$5" TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM} # build 中介軟體 BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI} export CFLAGS="$5 -Os -D__ANDROID_API__=${ANDROID_VERSION} --sysroot=${SYSROOT} \ -isystem ${NDK_PATH}/sysroot/usr/include \ -isystem ${NDK_PATH}/sysroot/usr/include/${HOST} " export LDFLAGS=-pie echo "path==>$PATH" echo "build_dir==>$BUILD_DIR" echo "ARCH==>$ARCH" echo "ANDROID_ARCH_ABI==>$ANDROID_ARCH_ABI" echo "HOST==>$HOST" echo "CFALGS==>$CFALGS" echo "COMPILER==>$COMPILER-gcc" echo "PROCESSOR==>$PROCESSOR" mkdir -p ${BUILD_DIR} #建立當前arch_abi的編譯目錄,比如:binary/armeabi-v7a cd ${BUILD_DIR} #此處 進了當前arch_abi的2級編譯目錄 cat >toolchain.cmake << EOF set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR $6) set(CMAKE_C_COMPILER ${TOOLCHAIN}/bin/${COMPILER}-gcc) set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN}/${COMPILER}) EOF # 此處不頂格寫指令碼會報一個錯誤 cmake -G"Unix Makefiles" \ -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \ -DCMAKE_POSITION_INDEPENDENT_CODE=1 \ -DCMAKE_INSTALL_PREFIX=${PREFIX} \ -DWITH_JPEG8=1 \ ${MY_SOURCE_DIR} make clean make make install #從當前arch_abi編譯目錄跳出,對應上面的cd ${BUILD_DIR},以便function多次執行 cd ../../ echo "-------------------$2 build end-------------------------" } # build armeabi build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS" arm #build armeabi-v7a build_bin arm armeabi-v7a arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS" arm #build arm64-v8a build_bin arm64 arm64-v8a aarch64-linux-android aarch64-linux-android "$ANDROID_ARMV8_CFLAGS" aarch64 #build x86 build_bin x86 x86 x86 i686-linux-android "$ANDROID_X86_CFLAGS" i386 #build x86_64 build_bin x86_64 x86_64 x86_64 x86_64-linux-android "$ANDROID_X86_64_CFLAGS" x86_64

2.4.2.2 android-cmake(自帶編譯鏈)

注意
這個指令碼要求Linux環境的Android-cmake,通過Android sdk-manager下載更新cmake,android-cmake已經自帶交叉編譯工具鏈,但通常我們不使用cmake帶的,因為他腳本里寫死了NDK版本12,而NDK的build/cmake目錄裡也帶了相應的編譯鏈,所以,我們一般使用我們NDK自帶的編譯鏈。
# lib-name
MY_LIBS_NAME=libjpeg-turbo
MY_SOURCE_DIR=$(pwd)/libjpeg-turbo-master
MY_BUILD_DIR=binary

CMAKE_PATH=/home/as/Android/cmake-3.6.4111459-linux-x86_64

export PATH=${CMAKE_PATH}/bin:$PATH

NDK_PATH=/home/as/Android/android-ndk-r15c
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=24

ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"  # -mfpu=vfpv3-d16  -fexceptions -frtti
ANDROID_ARMV8_CFLAGS="-march=armv8-a "  			     # -mfloat-abi=softfp -mfpu=neon -fexceptions -frtti
ANDROID_X86_CFLAGS="-march=i386 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"

# params($1:arch,$2:arch_abi,$3:host,$4:compiler,$5:cflags,$6:processor)
build_bin() {

    echo "-------------------start build $1-------------------------"

    ANDROID_ARCH_ABI=$1    # armeabi armeabi-v7a x86 mips
    CFALGS="$2"
    
    PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/
    # build 中介軟體
    BUILD_DIR=./${MY_BUILD_DIR}/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}

    echo "path==>$PATH"
    echo "build_dir==>$BUILD_DIR"
    echo "ANDROID_ARCH_ABI==>$ANDROID_ARCH_ABI"
    echo "CFALGS==>$CFALGS"


    mkdir -p ${BUILD_DIR}
    cd ${BUILD_DIR}

    # -DCMAKE_MAKE_PROGRAM=${NDK_PATH}/prebuilt/${BUILD_PLATFORM}/bin/make \
    # -DCMAKE_ASM_COMPILER=${NDK_PATH}/prebuilt/${BUILD_PLATFORM}/bin/yasm \

    cmake -G"Unix Makefiles" \
      -DANDROID_ABI=${ANDROID_ARCH_ABI} \
      -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
      -DCMAKE_BUILD_TYPE=Release \
      -DANDROID_NDK=${NDK_PATH} \
      -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
      -DCMAKE_POSITION_INDEPENDENT_CODE=1 \
      -DCMAKE_INSTALL_PREFIX=${PREFIX} \
      -DANDROID_ARM_NEON=TRUE \
      -DANDROID_TOOLCHAIN=clang \
      -DANDROID_STL=c++_static \
      -DCMAKE_C_FLAGS="${CFALGS} -Os -Wall -pipe -fPIC" \
      -DCMAKE_CXX_FLAGS="${CFALGS} -Os -Wall -pipe -fPIC" \
      -DANDROID_CPP_FEATURES=rtti exceptions \
      -DWITH_JPEG8=1 \
      ${MY_SOURCE_DIR}

    make clean
    make
    make install

    cd ../../../

    echo "-------------------$1 build end-------------------------"
}

# build armeabi
build_bin armeabi "$ANDROID_ARMV5_CFLAGS"

#build armeabi-v7a
build_bin armeabi-v7a "$ANDROID_ARMV7_CFLAGS"

#build arm64-v8a
build_bin arm64-v8a "$ANDROID_ARMV8_CFLAGS"

#build x86
build_bin x86 "$ANDROID_X86_CFLAGS"

#build x86_64
build_bin x86_64 "$ANDROID_X86_64_CFLAGS"

2.4.3 去掉版本號

動態庫的版本號
  安裝規則一般so都會帶版本號,但是如果我們在Android上使用不帶版本號。可以通過修改CMake指令碼,不帶版本號。

動態庫實現版本號一般使用SET_TARGET_PROPERTIES指令定義一下語句:
  SET_TARGET_PROPERTIES(target PROPERTIES VERSION 1.2 SOVERSION 1)
VERSION 指代動態庫版本,SOVERSION 指代 API 版本

  1. libjpeg-turbo-master/CMakeLists.txt中註釋
    turbojpeg不使用版本號
  2. libjpeg-turbo-master/sharedlib/CMakeLists.txt中註釋
    在這裡插入圖片描述

2.4.4 執行編譯指令碼

sh build.sh
編譯執行
註釋版本號編譯
arm64-v8a
註釋版本號
註釋版本號message

2.4.5 編譯可能遇到的問題

1.Syntax error: end of file unexpected (expecting "}")
編譯指令碼中 cat <<EOF >檔名 內容 EOF,最好頂格寫,否則可能出現上述錯誤
2.未識別的cflags引數
一些cflags引數可能導致編譯識別,修改編譯出錯的引數即可

2.4.6 install結果

編譯目錄

install目錄

dist_libs

arm64_v8a
註釋了版本號
註釋掉版本號的編譯

相關推薦

編譯Android環境libjpeg-turbo使用cmake

1. libjpeg-turbo   前面已經編譯過1.5.91版本的libjpeg-turbo,現在版本升級到2.0.1,基於CMake編譯。   依然還是一樣,按照官網介紹,libjpeg-turbo比libjpeg快2-6倍,得益於它高度優化的哈夫曼演算

Python爬蟲:mac環境apktool反編譯Android安卓程式碼

所需工具 Java環境 apktool:反編譯APK檔案,得到classes.dex檔案 dex2jar:將反編譯後的classes.dex檔案轉化為.jar檔案 jd-gui:用於將.jar檔案轉換成java程式碼 以上所需的工具打包下載: 連結

Androidlibjpeg-turbo編譯筆記

#####學習libjpeg-turbo的原因,最近專案中需要解碼1080p的圖片轉為yuv進行視訊預覽,原本的ffmpeg實現解碼及縮放圖片,但是在大部分主流Android機型上效率不高,android手機發熱會有明顯降頻現象,導致速率降低,偶爾在網上看到libjpeg-t

libjpeg-turbo 編譯 android,ios,linux,windows 各個平臺需要的包

libjpeg-turbo是用於處理圖片的,比如壓縮圖片,或者生成縮圖。 編譯各個平臺libjpeg-turbo 主要資料來源於官方編譯文件,雖然官方文件上寫得很清晰,但是還是有些地方可能會踩坑。寫這篇文章希望能幫助大家更好的編譯libjpeg。 1.編譯an

如何用NDK建立一個標準的android環境交叉編譯工具鏈(Cross Toolchain)

轉自:http://blog.sina.com.cn/s/blog_4a0a39c30101q1u4.htmlhttp://www.linuxidc.com/Linux/2014-11/109905.htmandroid原始碼在 prebuilts 目錄已經自帶有交叉編譯工具

如何用NDK建立一個標準的android環境交叉編譯工具鏈(Cross Toolchain)(轉)

android原始碼在 prebuilts 目錄已經自帶有交叉編譯工具鏈,但這個還不是一個標準的可直接編譯程式碼的編譯器,還需要依賴android ndk 的標頭檔案及庫檔案,才能進行編譯和連結,且版本也比較保守(4.0原始碼自帶的是gcc 4.4.3,

在原始碼環境編譯Android studio專案時的mk指令碼編寫

1、Main專案是主工程,下面有名為app的專案       CommonLib是庫工程,下面有名為lib的專案       Main專案會用到CommonLib庫。 2、原始碼環境中兩個專案是在同一個目錄下,平級的。Android.mk分別在各自的根目錄下。 3、參考

交叉編譯環境學習(編譯Android上的可執行程式)

        前幾天幫忙師兄發現的Android上的一個驅動程式漏洞,奈何技術不夠耐心不足,沒有找到漏洞的根源。由於程式要由c程式來觸發,而c程式是在pc上的開發的,要在Android裝置上執行,這

ubuntu 15.10 編譯Android原始碼環境搭建

概述: 作為一個Android開發者,想要自己提升一個階段,想深入瞭解 Android 相關的知識,Activity 是工作流程是怎樣的? View 是怎樣繪製的? 怎樣修改一些系統相關的應用?等等,就得要深入Android 原始碼~所以就要先獲取An

在高通平臺Android環境編譯核心模組

高通Android環境中Linux核心會作為Android的一部分進行編譯,直接使用make即可一次性從頭編到尾。而有的平臺比如Marvell,核心的編譯操作相對比較獨立,必須使用標準的核心編譯命令進行單獨編譯。一般來說,用高通的這種方式比較傻瓜化,一步到底的感覺;而用Mar

編譯Android ROM環境搭建

1.7 prot 重裝 root make offic ssh ubunt -i 環境搭建 1 安裝ubuntu 推薦12.04或13.10 2 安裝jdk7和一些所需要的包安裝jdk7$ sudo apt-get update$ sudo apt-get install

下載編譯 Android wear 源代碼,嘗試制作可穿戴設備功能

nal mini external ubuntu party pad inux aos apt-get 體驗 Android Wear 緣由: Android wear 代碼公布已經非常久了。一直沒有嘗試,這裏是個編譯的過程和步驟,假設要嘗試。本文假定讀者已經有

vscode--搭建自動編譯sass環境

logs mod mil 樣式 name alt pil 項目 自動安裝 一,安裝插件及使用步驟 1、vscode安裝Live Sass Compiler,由於該插件依賴Live Server ,所以會自動安裝Live Server 2、點擊vscode底部的Watch

mac 下 react Native android環境搭建

否則 編譯速度 方案 立即生效 cat blog ref spa 默認 1、參考 上一篇的博客文章 “mac 下 react Native ios環境搭建”,前面幾步都是必須的,只是,原生客戶端不一致 2、Android Studio的安裝 A:安裝JAVA

java/maven/mysql/python/android環境變量

mysql pat java環境 java oid python jdk androi 變量 java環境變量: 變量名: JAVA_HOME 變量值: D:\java\jdk 變量名:path 變量值:%JAVA_HOME%\bin; maven環境變量: 變量名: m

Appium(2)-Android環境配置

jdk eight -o ted 可用 path變量 align 分辨 結果 第二節 安裝Android開發環境   如果你的環境是MAC那麽可以直接跳過這一節。就像我們在用Selenium進行web自動化測試的時候一樣,我們需要一個瀏覽器來執行測試腳本。那麽移動端自

android--環境搭建

bae adt 問題 安裝 開發環境 software 開發 mir 具體步驟 參考文檔:http://www.cnblogs.com/allenzheng/archive/2012/11/10/2762379.html  http://blog.csdn.ne

用Gradle命令行編譯Android工程

led app oid 錯誤 windows failure except per AI 在Android sdk 目錄下的samples/android-21/ 文件夾下,任找一個工程,如果在命令行直接編譯 可能會報這種錯誤:gradle buile.gradle FA

Android環境配置

走了 clip 源代碼 開源 ... 記錄 選擇 發現 uno   最近頭腦發熱,想折騰一下安卓給自己弄個離線app,自己用就行,說做就做。   5月14日晚上回家開始在服役多年的win32電腦上開始了一晚上,前幾個小時,很快就把JDK+eclipse+SDK+ADT這一套

Ubuntu(64位)編譯Android源碼常見錯誤解決辦法

androi box track generic perf prop csdn AI not find 2013年07月10日 14:47:27 閱讀數:1239 錯誤: /usr/include/gnu/stubs.h:7:27: error: gnu/s