編譯Android環境的libjpeg-turbo使用cmake
1. libjpeg-turbo
前面已經編譯過1.5.9
1版本的libjpeg-turbo,現在版本升級到2.0.1
,基於CMake
編譯。
依然還是一樣,按照官網介紹,libjpeg-turbo
比libjpeg
快2-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中編譯
2.2 編譯要求
我們將參照原始碼中的BUILDING.md
編譯,github地址BUILDING.md
2.3 配置環境變數
把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 版本
libjpeg-turbo-master/CMakeLists.txt
中註釋
libjpeg-turbo-master/sharedlib/CMakeLists.txt
中註釋
2.4.4 執行編譯指令碼
sh build.sh
註釋版本號編譯
註釋版本號
2.4.5 編譯可能遇到的問題
- 1.
Syntax error: end of file unexpected (expecting "}")
- 編譯指令碼中 cat <<EOF >檔名 內容 EOF,最好頂格寫,否則可能出現上述錯誤
- 2.未識別的
cflags
引數 - 一些cflags引數可能導致編譯識別,修改編譯出錯的引數即可
2.4.6 install結果
註釋了版本號
相關推薦
編譯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程式碼 以上所需的工具打包下載: 連結
Android上libjpeg-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