前言
- 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脚本
- 执行
vim build.sh - 将修改后的自定义sh文件粘贴
- 执行
chmod +x build.sh
./build.sh
如果有如下提示
说明需要下载 Cmake
执行以下命令即可下载
如果你严格按照官方的复制,就会有以下错误,那么就把 {source_directory}删掉即可
取出编译后的文件
在上一步的编译结果,取出以下文件,并按照路径放至 AS 项目中.
!
如果C++ 代码出错, 则使用NDK 工具包中的 addr2line
上图表明 native-lib.cpp 的 82 行出错.