经过 上一篇博客的步骤后,生成了八个带版本号的 .so 库,接下来进行导入 NDK 项目的操作
第一步:用 Android Studio 新建 FFmpegDemo 项目,注意勾选 include c++ support 选项
项目创建完成后,在 libs/ 下新建 armeabi/
和 inlcude/
目录,并将上一篇博客中生成的 android/arm/include
目录下的文件放入 include 目录,android/arm/lib
下的带版本号的 .so 文件放入 armeabi/
目录,如下所示:
第二步:修改 CMakeLists.txt 文件的内容如下:
# 指定 cmake 最小版本
cmake_minimum_required(VERSION 3.4.1)
# 最终生成的共享库命名为:native-lib,源文件路径在 src/main/cpp/native-lib.cpp
add_library( native-lib
SHARED
src/main/cpp/native-lib.cpp )
# 寻找 log 库,然后赋值给 log-lib,用于在 NDK 开发中输出 Log 信息
find_library(log-lib log)
# 指定 include 头文件所在路径
include_directories(libs/include)
# 设置根目录变量 DIR
set(DIR ../../../../libs)
# 这一句和 下面的 set_target_properties 这一句表示,
# 将 armeabi 目录下的 libavcodec-56.so 导入为 avcodec-56 库,并且在项目中引用
# 下面的七组功能类似。 注意:add_library 中的 avcodec-56 命名 需要与 .so 库的命名一致
# 去掉前缀 lib 和后缀 .so
add_library( avcodec-56
SHARED
IMPORTED )
set_target_properties( avcodec-56
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavcodec-56.so
)
#
add_library( avdevice-56
SHARED
IMPORTED )
set_target_properties( avdevice-56
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavdevice-56.so
)
#
add_library( avfilter-5
SHARED
IMPORTED )
set_target_properties( avfilter-5
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavfilter-5.so
)
#
add_library( avformat-56
SHARED
IMPORTED )
set_target_properties( avformat-56
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavformat-56.so
)
#
add_library( avutil-54
SHARED
IMPORTED )
set_target_properties( avutil-54
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavutil-54.so
)
#
add_library( postproc-53
SHARED
IMPORTED )
set_target_properties( postproc-53
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libpostproc-53.so
)
#
add_library( swresample-1
SHARED
IMPORTED )
set_target_properties( swresample-1
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libswresample-1.so
)
#
add_library( swscale-3
SHARED
IMPORTED )
set_target_properties( swscale-3
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libswscale-3.so
)
# 最终生成 native-lib 库,以及生成所依赖的其他的库
target_link_libraries( native-lib
avcodec-56
avdevice-56
avfilter-5
avformat-56
avutil-54
postproc-53
swresample-1
swscale-3
${log-lib}
)
第三步:在 MainActivity 中加载 .so 库
注意:native-lib 需要写在最下面
第四步:修改 app module 下的 build.gradle 文件
在 android.defaultConfig 下,添加如下内容:
指定 abi 架构 为 armeabi,以及指定 jniLibs 所在目录
第四步:在 native-lib.cpp 中添加如下头文件引用
#include <jni.h>
#include <string>
#include <android/log.h>
// 告诉编译器按照 C 的规则去编译函数
extern "C" {
//编码
#include "libavcodec/avcodec.h"
//封装格式处理
#include "libavformat/avformat.h"
//像素处理
#include "libswscale/swscale.h"
}
#define LOGI(FORMAT, ...) __android_log_print(ANDROID_LOG_INFO,"jason",FORMAT,##__VA_ARGS__);
#define LOGE(FORMAT, ...) __android_log_print(ANDROID_LOG_ERROR,"jason",FORMAT,##__VA_ARGS__);
最后在 stringFromJNI 方法中添加两个函数:
LOGE("测试 log");
av_register_all();
最终效果如下:
最后,运行项目,并生成 APK,如果没有报错,则表示引用 ffmpeg 库到 android 项目成功了