首先要有ffmpeg编译后的文件,这个网上很多,如果懒得编译,直接从我后面的demo中的lib文件夹里去拿就行了。
第一种
新建一个ndk项目:
打开后的目录结构是这样的:
然后将armeabi-v7a文件夹复制到libs下,armeabi-v7a文件下有.a文件:
然后在app的build.gradle文件设置成这样:
把include文件夹(demo里有)复制到cpp文件夹下,里面包含了.h头文件:
紧接着将CMakeLists.txt替换成如下内容:
cmake_minimum_required(VERSION 3.4.1)
add_library(
native-lib
SHARED
native-lib.cpp)
include_directories(include)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../../../libs/${CMAKE_ANDROID_ARCH_ABI}")
find_library(
log-lib
log)
target_link_libraries(
native-lib
avformat avcodec avfilter avutil swresample swscale
${log-lib})
其中的include_directories可以设置头文件目录
CMAKE_CXX_FLAGS表示全局变量, CMAKE_SOURCE_DIR表示当前这个文件(CMakeLists.txt)的所在路径
CMAKE_SOURCE_DIR}/…/…/…/libs/${CMAKE_ANDROID_ARCH_ABI}:表示.a文件所在的路径
${CMAKE_ANDROID_ARCH_ABI}是系统定义的变量,他的含义就是之前在build.gradle中定义的:abiFilters ‘armeabi-v7a’
到这里就完成了,在native-lib.cpp中写个测试案例:
#include <jni.h>
#include <string>
extern "C" {
#include "include/libavutil/avutil.h"
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(av_version_info());
}
运行就能在手机上看见版本号了:
第二种:
其实几乎没什么变化,变化就是在src/main/下新建一个名为jniLibs的文件夹:
然后同样将之前的armeabi-v7a文件夹(内含.a文件)复制进去。
build.gradle的配置不变,与第一种的一样。
同样的将include文件复制到cpp文件夹下:
CMakeLists.txt的编写只有set稍微有些不同,但是很好理解,还是要将路径指向.a文件所在处:
cmake_minimum_required(VERSION 3.4.1)
include_directories(include)
#主要还是要把-L后面的路径设置成.a文件所在的路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
add_library(
native-lib
SHARED
native-lib.cpp)
find_library(
log-lib
log)
target_link_libraries(
native-lib
avformat avcodec avfilter avutil swresample swscale
${log-lib})
native-lib.cpp:
#include <jni.h>
#include <string>
extern "C" {
#include "include/libavutil/avutil.h"
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(av_version_info());
}
demo地址:https://github.com/lyx19970504/Android-Studio-ffmpeg