CMAKE 编译libjpeg-turbo, 形成 So 库过程记录

2,200 阅读2分钟

前言

  • Android系统使用的图片压缩,有一个参数叫optimize_coding,如果设置为TRUE,将会使得压缩图像过程中基于图像数据计算哈弗曼表,由于这个计算会显著消耗空间和时间,默认值被设置为FALSE(Android 7.0 以下的设备为了性能,选择了这个默认值)。 但是如今设备性能很好,就可以打开,如何打开? 就使用 libjpeg-turbo
  • 本文章通过CMAKE的方式进行库的编译
  • SO库 其实是shared库(动态链接库)的文件形式.
  • CMAKE 一款外部构建工具,可与 Gradle 搭配使用来构建原生库

虽然还可以通过 ndk-build(Android.mk等) 但是没有 CMAKE 方便.

准备

下载源码

概述

整体流程: 通过配置CMAKE指导编译器将哪些源文件编译成so库的过程

  • 可直接通过 AS 执行项目中的 CMakeLists.txt 即可

CMakeLists.txt 可类比于我们熟悉的 build.gradle,完成库的配置、依赖.

  • 执行CMAKE命令的脚本文件

方法一: AS 执行项目中的 CMakeLists.txt

创建支持C/C++的项目

你也可以创建普通工程,然后添加相关配置. 如图创建,AS自动进行配置,轻松。

删除 cpp 文件夹的内容,创建include文件,将下载的源码拷贝至此文件夹.

更新app模块下的build.gradle 中 CMakeLists.txt 路径

make project

查找 so 库

AS 默认产出so库位置不太清楚,所以直接通过命令查找

大功告成.

当你走到这一步发现我的so库名字和你编译的so库不一样,是因为我在CMakeLists.txt中添加了 set_target_properties(turbojpeg PROPERTIES OUTPUT_NAME "TurboJpegLib" )

方法二: 执行CMAKE命令的脚本文件

在 官方文档的 Building libjpeg-turbo 模块中, 寻找 Android 平台的编译方式,即 Building libjpeg-turbo for Android 部分。此部分列举了各个平台编译方式,我们选择自己所需平台,以 Armv8 (64-bit) 为例。

# 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 \
make
  • 通过 cd 指定 turbo 项目 所在绝对路径

进入libjpeg-turbo目录,创建一个shell脚本

  1. 执行 vim build.sh
  2. 将修改后的自定义sh文件粘贴
  3. 执行
chmod +x build.sh
./build.sh

如果有如下提示

说明需要下载 Cmake

执行以下命令即可下载

如果你严格按照官方的复制,就会有以下错误,那么就把 {source_directory}删掉即可

取出编译后的文件

在上一步的编译结果,取出以下文件,并按照路径放至 AS 项目中.

!

如果C++ 代码出错, 则使用NDK 工具包中的 addr2line

上图表明 native-lib.cpp 的 82 行出错.