日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )

發(fā)布時(shí)間:2025/6/17 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、交叉編譯 Shell 腳本參考
  • 二、NDK r16b 版本配置
  • 三、libjpeg-turbo 交叉編譯 Shell 腳本
  • 四、執(zhí)行 libjpeg-turbo 交叉編譯 Shell 腳本 開(kāi)始編譯
  • 五、拷貝函數(shù)庫(kù)頭文件到 Android Studio
  • 六、Android Studio 工程配置 CMakeLists.txt 構(gòu)建腳本
  • 七、Android Studio 工程配置 build.gradle 構(gòu)建腳本
  • 八、測(cè)試 libjpeg-turbo 函數(shù)庫(kù)





一、交叉編譯 Shell 腳本參考



交叉編譯腳本參考 : 之前已經(jīng)做過(guò)兩個(gè)函數(shù)庫(kù)的交叉編譯腳本 , FFMPEGx264 開(kāi)源庫(kù) , 而且都是使用 configure 生成 Makefile 文件 ;


① FFMPEG 函數(shù)庫(kù)的交叉編譯腳本 : 【Android FFMPEG 開(kāi)發(fā)】FFMPEG 交叉編譯配置 ( 下載 | 配置腳本 | 輸出路徑 | 函數(shù)庫(kù)配置 | 程序配置 | 組件配置 | 編碼解碼配置 | 交叉編譯配置 | 最終腳本 ) 十一、交叉編譯配置 Shell 腳本 ( 重點(diǎn) )

② x264 函數(shù)庫(kù)的交叉編譯腳本 : 【Android RTMP】Android Studio 集成 x264 開(kāi)源庫(kù) ( Ubuntu 交叉編譯 | Android Studio 導(dǎo)入函數(shù)庫(kù) ) 二、 x264 交叉編譯

參考上述交叉編譯腳本 , 編寫(xiě) libjpeg-turbo 函數(shù)庫(kù) 的交叉編譯腳本 ; ( 上述編譯腳本僅做參考 )


發(fā)現(xiàn) libjpeg-turbo 源碼路徑下的 BUILDING.md 文件中有預(yù)置好的交叉編譯腳本示例 ;





二、NDK r16b 版本配置



NDK 配置 : 交叉編譯 libjpeg-turbo 只能使用 NDK r16b 或者之前的版本 , 這里使用 r16b 版本 ;


① NDK 官方主頁(yè) : 點(diǎn)擊該鏈接進(jìn)入界面

② NDK 下載地址 : 點(diǎn)擊該鏈接進(jìn)入界面

③ 停止維護(hù)版本下載地址 : 舊版本 NDK 下載地址 , 這里在該地址中下載 Android NDK,修訂版 16b(2017 年 12 月)版本 , 編譯要求使用 NDK r16b 或者之前的版本 ;

④ 直接下載地址 : android-ndk-r16b-linux-x86_64.zip , 這是 Linux 64 位 NDK 下載地址 ;





三、libjpeg-turbo 交叉編譯 Shell 腳本



1. 需要配置的選項(xiàng) :


① NDK 路徑 : /root/NDK/android-ndk-r16b , 將 NDK 下載后 , 解壓的路徑 ;

② 交叉編譯工具鏈 : gcc , 官方讓在 gcc , g++ , clang 中三選一 ; 這是 C 語(yǔ)言項(xiàng)目 , 選擇 gcc 即可 ;

③ 最低 Android 版本 : 16 即可 , 基本沒(méi)有低于 16 版本的手機(jī) ;

④ 編譯結(jié)果輸出目錄 : /root/picture_compress/libjpeg-turbo-2.0.5/android

⑤ 源文件目錄 : /root/picture_compress/libjpeg-turbo-2.0.5



2. 替換上述配置 , 生成下面的配置文件 :

# 設(shè)置 NDK 的目錄 , 這里使用 ndk-r16b 版本 NDK_PATH=/root/NDK/android-ndk-r16b# 設(shè)置 NDK 的交叉編譯工具鏈 , 這里特別注明 , 只能使用 NDK r16b 或者之前的版本 TOOLCHAIN=gcc# Android 的最低兼容版本 ANDROID_VERSION=16# 進(jìn)入最終編譯生成編譯結(jié)果目錄 cd /root/picture_compress/libjpeg-turbo-2.0.5/android# 設(shè)置 源碼目錄 最后的 /root/picture_compress/libjpeg-turbo-2.0.5 就是源文件所在目錄 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 \/root/picture_compress/libjpeg-turbo-2.0.5 make



四、執(zhí)行 libjpeg-turbo 交叉編譯 Shell 腳本 開(kāi)始編譯



1. 創(chuàng)建編譯腳本 : 在 /root/picture_compress/libjpeg-turbo-2.0.5 目錄下創(chuàng)建 build.sh , 將上述 交叉編譯 Shell 腳本信息拷貝到該文件中 ;


2. 修改權(quán)限 , 然后執(zhí)行編譯腳本 :

$ chmod -R 777 build.sh $ ./build.sh

3. 生成的靜態(tài)庫(kù)與頭文件查看 : 服了 , 編譯后的結(jié)果都散的 , 不像 FFMPEG , x264 等 , 編譯后 , 頭文件都在 include 中 , 靜態(tài)庫(kù) 動(dòng)態(tài)庫(kù)都整整齊齊的放在對(duì)應(yīng)文件中 ;


① 靜態(tài)庫(kù) : 靜態(tài)庫(kù)在 /root/picture_compress/libjpeg-turbo-2.0.5/android 目錄中生成 ;

② 頭文件 : 需要自己去源碼中找頭文件 , 有些在 /root/picture_compress/libjpeg-turbo-2.0.5/android 目錄中 , 有些在 /root/picture_compress/libjpeg-turbo-2.0.5/ 目錄中 , 下圖中畫(huà)紅框的拷貝出來(lái) ;

③ 項(xiàng)目里扒 : 嫌麻煩的直接從 GitHub 中的 PictureCompress 項(xiàng)目 里面扒也可以 ;





五、拷貝函數(shù)庫(kù)頭文件到 Android Studio



1. 拷貝靜態(tài)庫(kù) : 將上述函數(shù)庫(kù) libturbojpeg.a 拷貝到 src/main/cpp/libs/armeabi-v7a 目錄中 ;


2. 拷貝頭文件 : 將上述 jconfig.h , jerror.h , jmorecfg.h , jpeglib.h , turbojpeg.h 頭文件拷貝到 src/main/cpp/include 目錄中 ;


3. 拷貝結(jié)果展示 :





六、Android Studio 工程配置 CMakeLists.txt 構(gòu)建腳本



配置構(gòu)建腳本 : 配置 src/main/cpp/CMakeLists.txt 構(gòu)建腳本 ;

cmake_minimum_required(VERSION 3.4.1)add_library( # 函數(shù)庫(kù)名稱native-lib# 動(dòng)態(tài)庫(kù)類型SHARED# 源文件native-lib.cpp)find_library( # 日志庫(kù)log-liblog )find_library( # JNI 圖形庫(kù)jnigraphics-libjnigraphics )# 設(shè)置頭文件搜索路徑 include_directories(include)# 通過(guò)設(shè)置編譯選項(xiàng), 設(shè)置函數(shù)庫(kù)的搜索路徑 # 此處的 ANDROID_ABI 是在 # build.gradle android->defaultConfig->externalNativeBuild->cmake # 下的 abiFilters 中設(shè)置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")target_link_libraries( # 鏈接動(dòng)態(tài)庫(kù)native-lib# 查找到的 libturbojpeg 靜態(tài)庫(kù)turbojpeg${log-lib}${jnigraphics-lib} )



七、Android Studio 工程配置 build.gradle 構(gòu)建腳本



在 build.gradle 構(gòu)建腳本中主要注意兩個(gè)配置選項(xiàng) :


① ARM 函數(shù)庫(kù)的 CPU 架構(gòu) : abiFilters ‘a(chǎn)rmeabi-v7a’

② C/C++ 代碼及函數(shù)庫(kù)的構(gòu)建腳本 : path “src/main/cpp/CMakeLists.txt”

apply plugin: 'com.android.application'android {compileSdkVersion 29defaultConfig {applicationId "kim.hsl.pc"minSdkVersion 16targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi-v7a'}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"//version "3.10.2"}} }dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }



八、測(cè)試 libjpeg-turbo 函數(shù)庫(kù)



在 native-lib.cpp 代碼中 , 使用 libturbojpeg.a 函數(shù)庫(kù)中的結(jié)構(gòu)體 , 看是否可以使用 ;

#include <jni.h> #include <string> #include <jpeglib.h> #include <android/bitmap.h> #include <malloc.h> #include <android/log.h> #include <bitset> #include <iosfwd>extern "C" JNIEXPORT jstring JNICALL Java_kim_hsl_pc_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";// 測(cè)試 libturbojpeg.a 函數(shù)庫(kù)jpeg_compress_struct jcs;__android_log_print(ANDROID_LOG_INFO, "JPEG", "jpeg_compress_struct jcs = %d", jcs.image_width);hello = hello + " , jpeg_compress_struct jcs = " + std::to_string(jcs.image_width);return env->NewStringUTF(hello.c_str()); }

經(jīng)測(cè)試函數(shù)庫(kù)可用 ;

總結(jié)

以上是生活随笔為你收集整理的【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。