前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )

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

作者头像
韩曙亮
发布2023-03-27 21:53:01
1.6K0
发布2023-03-27 21:53:01
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、交叉编译 Shell 脚本参考


交叉编译脚本参考 : 之前已经做过两个函数库的交叉编译脚本 , FFMPEG 和 x264 开源库 , 而且都是使用 configure 生成 Makefile 文件 ;

① FFMPEG 函数库的交叉编译脚本 : 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 ) 十一、交叉编译配置 Shell 脚本 ( 重点 )

② x264 函数库的交叉编译脚本 : 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 ) 二、 x264 交叉编译

参考上述交叉编译脚本 , 编写 libjpeg-turbo 函数库 的交叉编译脚本 ; ( 上述编译脚本仅做参考 )

发现 libjpeg-turbo 源码路径下的 BUILDING.md 文件中有预置好的交叉编译脚本示例 ;

二、NDK r16b 版本配置


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

① NDK 官方主页 : 点击该链接进入界面

② NDK 下载地址 : 点击该链接进入界面

③ 停止维护版本下载地址 : 旧版本 NDK 下载地址 , 这里在该地址中下载 Android NDK,修订版 16b(2017 年 12 月)版本 , 编译要求使用 NDK r16b 或者之前的版本 ;

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

三、libjpeg-turbo 交叉编译 Shell 脚本


1. 需要配置的选项 :

① NDK 路径 : /root/NDK/android-ndk-r16b , 将 NDK 下载后 , 解压的路径 ;

② 交叉编译工具链 : gcc , 官方让在 gcc , g++ , clang 中三选一 ; 这是 C 语言项目 , 选择 gcc 即可 ;

③ 最低 Android 版本 : 16 即可 , 基本没有低于 16 版本的手机 ;

④ 编译结果输出目录 : /root/picture_compress/libjpeg-turbo-2.0.5/android

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

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

代码语言:javascript
复制
# 设置 NDK 的目录 , 这里使用 ndk-r16b 版本
NDK_PATH=/root/NDK/android-ndk-r16b

# 设置 NDK 的交叉编译工具链 , 这里特别注明 , 只能使用 NDK r16b 或者之前的版本 
TOOLCHAIN=gcc

# Android 的最低兼容版本 
ANDROID_VERSION=16

# 进入最终编译生成编译结果目录
cd /root/picture_compress/libjpeg-turbo-2.0.5/android

# 设置 源码目录 最后的 /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

四、执行 libjpeg-turbo 交叉编译 Shell 脚本 开始编译


1. 创建编译脚本 : 在 /root/picture_compress/libjpeg-turbo-2.0.5 目录下创建 build.sh , 将上述 交叉编译 Shell 脚本信息拷贝到该文件中 ;

2. 修改权限 , 然后执行编译脚本 :

代码语言:javascript
复制
$ chmod -R 777 build.sh
$ ./build.sh

3. 生成的静态库与头文件查看 : 服了 , 编译后的结果都散的 , 不像 FFMPEG , x264 等 , 编译后 , 头文件都在 include 中 , 静态库 动态库都整整齐齐的放在对应文件中 ;

① 静态库 : 静态库在 /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/ 目录中 , 下图中画红框的拷贝出来 ;

③ 项目里扒 : 嫌麻烦的直接从 GitHub 中的 PictureCompress 项目 里面扒也可以 ;

五、拷贝函数库头文件到 Android Studio


1. 拷贝静态库 : 将上述函数库 libturbojpeg.a 拷贝到 src/main/cpp/libs/armeabi-v7a 目录中 ;

2. 拷贝头文件 : 将上述 jconfig.h , jerror.h , jmorecfg.h , jpeglib.h , turbojpeg.h 头文件拷贝到 src/main/cpp/include 目录中 ;

3. 拷贝结果展示 :

六、Android Studio 工程配置 CMakeLists.txt 构建脚本


配置构建脚本 : 配置 src/main/cpp/CMakeLists.txt 构建脚本 ;

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.4.1)

add_library( # 函数库名称
        native-lib
        # 动态库类型
        SHARED
        # 源文件
        native-lib.cpp)

find_library( # 日志库
        log-lib
        log )

find_library( # JNI 图形库
        jnigraphics-lib
        jnigraphics )

# 设置头文件搜索路径
include_directories(include)

# 通过设置编译选项, 设置函数库的搜索路径
# 此处的 ANDROID_ABI 是在
# build.gradle android->defaultConfig->externalNativeBuild->cmake
# 下的 abiFilters 中设置
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")

target_link_libraries( # 链接动态库
        native-lib

        # 查找到的 libturbojpeg 静态库
        turbojpeg

        ${log-lib}
        ${jnigraphics-lib} )

七、Android Studio 工程配置 build.gradle 构建脚本


在 build.gradle 构建脚本中主要注意两个配置选项 :

① ARM 函数库的 CPU 架构 : abiFilters ‘armeabi-v7a’

② C/C++ 代码及函数库的构建脚本 : path “src/main/cpp/CMakeLists.txt”

代码语言:javascript
复制
apply plugin: 'com.android.application'

android {
    compileSdkVersion 29

    defaultConfig {
        applicationId "kim.hsl.pc"
        minSdkVersion 16
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles 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'
}

八、测试 libjpeg-turbo 函数库


在 native-lib.cpp 代码中 , 使用 libturbojpeg.a 函数库中的结构体 , 看是否可以使用 ;

代码语言:javascript
复制
#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++";

    // 测试 libturbojpeg.a 函数库
    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());
}

经测试函数库可用 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、交叉编译 Shell 脚本参考
  • 二、NDK r16b 版本配置
  • 三、libjpeg-turbo 交叉编译 Shell 脚本
  • 四、执行 libjpeg-turbo 交叉编译 Shell 脚本 开始编译
  • 五、拷贝函数库头文件到 Android Studio
  • 六、Android Studio 工程配置 CMakeLists.txt 构建脚本
  • 七、Android Studio 工程配置 build.gradle 构建脚本
  • 八、测试 libjpeg-turbo 函数库
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档