Android studio导入FFmpeg编译动态库文件

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库的基本使用

        • https://blog.csdn.net/donghualigong123/article/details/111314504
          
        • libs,jniLibs用来存放各种.so库文件

        • 在Android Studio中,默认匹配main下的jniLibs目录。

        • 如果没有jniLibs目录需要自己手动创建,并且库的名称也不能随便更改

        • AndroidStudio中,想用libs下的so库,必须手动去指定库的位置。

          •  sourceSets {
                    main{
                        jniLibs.srcDirs = ['libs'];
                    }
                }
            
        • 特别注意

          • 要么把所有的.so库全部放在libs目录下,要么全部放在jniLibs目录下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

檀良月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值