libyuv是Google开源的实现各种YUV格式与RGB格式之间相互转换、旋转、缩放的库。关于libyuv的具体介绍可以参考官网介绍。
Android Studio编译libyuv
在自己编译libyuv的过程中,遇到了很多坑。在解决这些坑的过程中发现,从网上查询的很多资料并没有对问题的解决提供帮助。因此,在自己趟过了所有的坑之后,就想把编译libyuv的过程整理了出来,一方面是做一个梳理和总结,另一方面也希望帮助更多有类似需求的人。
接下来,开始介绍在Android平台上,利用NKD编译包含libjpeg库的libyuv库。这个主要通过libyuv/Android.mk中的如下代码实现:
1 | include $(CLEAR_VARS) |
需要下载的库
编译依赖
NDK
因为NDK-r17之后的版本,不支持gcc编译so,需要使用clang来编译so库。因此编译时,需要确定好自己的NDK版本。
CMAKE, NASM, GCC等
该部分编译依赖为编译libjpeg-turbo库的编译依赖,具体可以参见libjpeg-turbo的BUILD.md
编译libjpeg-turbo
-
下载编译脚本,编译脚本位于libjpeg-turbo目录下,共计有三个脚本:
- config.sh:配置编译参数,例如ANDROID_NDK_ROOT等,需要根据自己的环境变量进行替换。
- build_jpeg.sh:编译某个CPU架构的so库,该脚本中的变量一般不需要修改。
- build_jpeg_all.sh:编译所有CPU架构的so库
-
下载libjpeg-turbo源码:
git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git
。 -
将第1步中下载到的三个文件复制到libjepg-turob源码的根目录下:
cp -r libjpeg-turbo/* JPEG_SRC_ROOT_PATH/
。 -
修改config.sh中的
ANDROID_NDK_ROOT
为自己的NDK路径,修改ANDROID_NDK_VERSION
为对应的数字版本。例如r16b版本的为ANDROID_NDK_VERSION=16
。 -
运行
sh build_jpeg_all.sh
编译libjpeg-turbo,运行之后会在当前目录的libs目录下生成各种CPU架构对应的so库。如下图所示:图1. libjpeg-turbo编译产物
编译libyuv
-
将之前下载的libyuv的源码导入到Android Studio中的指定目录:PROJECT/app/jni/libyuv,该目录自己定义就可以。
-
将上一步生成的so文件按照ABI的格式复制到libyuv/libs目录下,如下图所示:
图2
-
修改libyuv目录下的Android.mk文件,libyuv/Android.mk文件中的第4~12行的内容即可。
1
2
3
4
5
6
7
8
9########################################################
## {{BEGIN 增加如下的代码
include $(CLEAR_VARS)
LOCAL_MODULE := jpeg
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libjpeg.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
## END}}
######################################################## -
按照仓库所示的myapp/jni目录下的Android.mk和Application.mk文件修改自己代码中的对应文件即可,主要是用于编译libyuv使用。
-
修改自己app目录下的build.gradle,在android{}中增加如下编译任务
1
2
3
4
5externalNativeBuild {
ndkBuild {
path file('jni/Android.mk')
}
} -
点击Android Studio的编译按钮编译即可,编译后生成的编译产物如下图所示:
图3. libyuv的编译产物