android studio cmake调用ffmpeg库

android studio现在引入cmake可以很好地实现ndk的编写。现在我们就使用这种方式实现ffmpeg库的调用

1. ffmpeg编译

    此部分可以参考我们之前的文章Compile ffmpeg for Android,因此不加赘述

2. 修改CMakeLists.txt

 add_library(avcodec-55
            SHARED
            IMPORTED)
  set_target_properties(avcodec-55
                      PROPERTIES IMPORTED_LOCATION
                      ../../../../libs/x86_64/libavcodec-55.so)


  target_link_libraries( # Specifies the target library.
                       native-lib


                       # Links the target library to the log library
                       # included in the NDK.
                       avcodec-55
                       ${log-lib} )

  //注意set_target_properties设置的路径是相对于cpp文件的路径

   这样我们的native-lib.cpp就可以调用ffmpeg的库函数了

3. 增加include文件

include_directories(src/main/cpp/include)

如果没有这句话,就不能调用ffmpeg的头文件

        //注意include_directories的路径是相对于cMakeLists.txt的路径。

4. link error:wrong file format

如果我们只有x86_64平台的ffmpeg库文件,而平时我们生成apk文件都是全平台的。所以mips等平台link就会出现wrong file format。

解决问题的方法:

  添加平台过滤。

defaultConfig{
...
externalNativeBuild {
            cmake {
                abiFilters "x86_64"
                cppFlags ""
            }
        }
}

5.undefined reference to "avcodec_register_all"

我们已经在cmakeLists.txt中添加了头文件,以及库文件链接,但是还是找不到函数定义。

这是因为我们头文件引用时出现问题,因为ffmpeg的头文件是c头文件

extern "C"{

#include "libavcodec/avcodec.h"
}


6. java如何调用库文件

上面我们主要讲cpp调用库文件,此时我们需要将java如何调用

第一步,将so文件打包到apk文件中

sourceSets{
            main{
                jniLibs.srcDirs = ['libs']
//               jniLibs.srcDirs = ['src/main/jniLibs'] #将so放到src/main/jniLibs
            }
        }

同时我们需要将so文件拷贝到libs文件夹下

第二步,在java文件中直接调用

System.loadLibrary("avcodec-55");


参考文章:http://lib.csdn.net/article/liveplay/49953?knId=1586

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值