基于上一篇(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工程了。
后面有空来更新解码视频播放部分。