Android studio导入FFmpeg编译动态库文件
https://zhuanlan.zhihu.com/p/356709766
-
新建一个C/C++项目
-
在cpp中建立ffmpegs.include文件夹存放ffmpeg头文件
-
在main目录下新建jniLibs文件夹存放.so动态链接库
-
目录结构截图
-
编辑CmakeLists.txt,配置编译过程
-
# For more information about using CMake with Android Studio, read the # documentation: https://d.android.com/studio/projects/add-native-code.html cmake_minimum_required(VERSION 3.10.2) project("jni_ndk") # 导入ffmpeg # 定义文件目录变量名 set(ffmpeg_lib_dir ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}) set(ffmpeg_head_dir ${CMAKE_SOURCE_DIR}/ffmpeg) # 导入头文件目录 include_directories( ${ffmpeg_head_dir}/include ) # 导入so文件 add_library(avcodec_lib SHARED IMPORTED) set_target_properties(avcodec_lib PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavcodec.so) add_library(avdevice_lib SHARED IMPORTED) set_target_properties(avdevice_lib PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavdevice.so) add_library(avfilter_lib SHARED IMPORTED) set_target_properties(avfilter_lib PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavfilter.so) add_library(avformat_lib SHARED IMPORTED) set_target_properties(avformat_lib PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavformat.so) add_library(avutil_lib SHARED IMPORTED) set_target_properties(avutil_lib PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavutil.so) add_library(swresample_lib SHARED IMPORTED) set_target_properties(swresample_lib PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libswresample.so) add_library(swscale_lib SHARED IMPORTED) set_target_properties(swscale_lib PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libswscale.so) # 生成一个jni_ndk动态库 add_library(jni_ndk SHARED native-lib.cpp) find_library(log-lib log) # 关联目标资源 target_link_libraries( # 指定目标库 jni_ndk # 关联目标 ${log-lib} android avcodec_lib avformat_lib avutil_lib swresample_lib swscale_lib)
-
-
配置build.gradle
-
android
-
// CMake 路径配置 externalNativeBuild { cmake { path file('../../JNI&NDK/app/src/main/cpp/CMakeLists.txt') version '3.10.2' } }
-
-
android.defaultConfig
-
// Cmake 编译配置 externalNativeBuild { cmake { cppFlags '' } // 配置 编译的cpu类型和导入log库 ndk { ldLibs "log" abiFilters "arm64-v8a","armeabi-v7a","x86" } }
-
-
-
验证ffmpeg是否导入成功
-
native-lib.cpp
-
Java层方法
-
public native String ffmpegInfo();
-
-
C层方法
-
extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavfilter/avfilter.h> #include <libavcodec/jni.h> JNIEXPORT jstring JNICALL Java_com_zt_jni_1ndk_FFmpeg_ffmpegInfo(JNIEnv *env, jobject thiz) { char info[40000] = {0}; AVCodec *c_temp = av_codec_next(NULL); while (c_temp != NULL) { if (c_temp->decode != NULL) { sprintf(info, "%sdecode:", info); } else { sprintf(info, "%sencode:", info); } switch (c_temp->type) { case AVMEDIA_TYPE_VIDEO: sprintf(info, "%s(video):", info); break; case AVMEDIA_TYPE_AUDIO: sprintf(info, "%s(audio):", info); break; default: sprintf(info, "%s(other):", info); break; } sprintf(info, "%s[%s]\n", info, c_temp->name); c_temp = c_temp->next; } return env->NewStringUTF(info); } }
-
-
调用后打印ffmpeg相关信息
-
-
-
遇到问题
-
报错:2 files found with path ‘lib/arm64-v8a/libavcodec.so’ from inputs:
-
解决:
-
build.gradle增加sourceSets
-
sourceSets { main{ jniLibs.srcDirs = ['libs'] } }
-
sourceSets用来指定项目包含哪些源文件或资源文件
-
-
Android libs库,jniLibs库的基本使用
-
-