今天看啥  ›  专栏  ›  玄嚣

FFMPEG 填坑之旅(壹----将库导入工程)

玄嚣  · 掘金  ·  · 2019-08-12 02:38
阅读 11

FFMPEG 填坑之旅(壹----将库导入工程)

基于上一篇(FFMPEG 填坑之旅(零----准备工作)),我们已经得到了FFMPEG Android armv7的so库,想要继续实现想要的动能,那就需要本小节的内容。

开始本节内容前,需要各位有一定的JNI基础。

现在的Android Studio 对JNI支持的还是很好了,能一键生成各种JNI到Java相互对应关系。生成的CMakeLists.txt也比之前的*.mk(Makefile)文件易读多了。

依然有选的过程在里面,这里以及以后,我都用了Mac,系统是当季最新款,Android Studio也是随稳定版一直更新的。

---------------------- 假装分割,以下入正题 -----------------------

新建工程,File->New->New Project,依次选中

这个界面就出现了,往下滑到最后有个Native C++

对,就是选中的那个,然后Next,选各位看官喜欢的属性,直到Finish就好了。我是沿用的旧设置,Android版本用的是4.4,语言用了Kotlin

Finish之后就是这样了

MainActivity里面是Kotlin内容,Cpp里面是JNI内容。

然后呢,我在App目录下创建jniLibs文件夹,然后我上一篇编的so是armv7的,就在jniLibs目录下创建了armeabi-v7a目录,把so全部扔了进去,激动的开始编。

首先,gradle 里面

defalutConfigs{
    ...
    
    ndk {
    abiFilters 'armeabi-v7a'
    }
}
复制代码

然后,native-lib.cpp里面

#include <jni.h>
#include <string>
#include "libavcodec/avcodec.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_laffey_myapplication_MainActivity_stringFromJNI(
    JNIEnv *env,
    jobject /* this */) {
    std::string hello = avcodec_configuration();
    return env->NewStringUTF(hello.c_str());
}

复制代码

开始编译。

激动....

然而挂了,Link失败,找不到库文件

搜了一下问题,到处都是解决方案,问题就在刚刚提到的CMakeLists.txt这个文件里面

在文件中加入这两段


# ffmpeg libs
add_library(avcodec SHARED IMPORTED)
set_target_properties(avcodec
    PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libavcodec.so)
add_library(avformat SHARED IMPORTED)
set_target_properties(avformat
    PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libavformat.so)
add_library(avfilter SHARED IMPORTED)
set_target_properties(avfilter
    PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libavfilter.so)
add_library(avutil SHARED IMPORTED)
set_target_properties(avutil
    PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libavutil.so)
add_library(swresample SHARED IMPORTED)
set_target_properties(swresample
    PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libswresample.so)
add_library(swscale SHARED IMPORTED)
set_target_properties(swscale
    PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libswscale.so)
# end of ffmpeg libs
复制代码
target_link_libraries( # Specifies the target library.
   ...
    avcodec
    avformat
    avfilter
    avutil
    swresample
    swscale
    # end of ffmpeg libs linked
    )
复制代码

平静的再来一发编译,依然挂了,,找不到avcodec_configuration()

陡然反应过来,FFMPEG是C的,这个文件是C++的,#include "libavcodec/avcodec.h"这里有问题,修改了一下,代码变成这样

#include <jni.h>
#include <string>
extern "C" {
#include "libavcodec/avcodec.h"
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_laffey_myapplication_MainActivity_stringFromJNI(
    JNIEnv *env,
    jobject /* this */) {
    std::string hello = avcodec_configuration();
    return env->NewStringUTF(hello.c_str());
}

复制代码

这下O了,输出了编so库写入的各种config。

这就是导入库进Android工程了。

后面有空来更新解码视频播放部分。




原文地址:访问原文地址
快照地址: 访问文章快照