编译环境
- macOS:10.13.6
- Android NDK:16.1.4479499
- FFmpeg:4.0.2
FFmpeg历史版本:www.ffmpeg.org/releases/
编译脚本
sh
#!/bin/bash
# 配置自己的NDK路径
NDK_ROOT=/Users/sun/AndroidSDK/android-sdk-macosx/ndk/16.1.4479499
# NDK中交叉编译gcc所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
# gcc参数
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"
INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"
# 定义编译后输出的目录
PREFIX=./android/arm32
# --enable-small 优化大小,必须优化才行
# --disable-programs 不编译ffmpeg程序(命令行工具),我们是需要获取静态、动态库
# --disable-avdevice 关闭avdevice模块,此模块在android中无用
# --disable-encoders 关闭所有编码器(播放不需要编码)
# --disable-muxers 关闭所有复用器(封装器),不需要生成mp4这样的文件,可以关闭
# --disable-filters 关闭所有滤镜
# --enable-cross-compile 开启交叉编译(ffmpeg是跨平台的)
# --cross-prefix 查找ndk的gcc
# --disable-shared 关闭动态库
# --enable-static 开启静态库
# --sysroot 寻找NDK所有的库文件
# --extra-cflags 会传给gcc的参数
# --arch 编译版本 v7a=arm; v8a=arm64;
# --target-os 目标系统
function build_android
{
echo "compile ffmpeg start..."
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot/" \
--arch=arm \
--target-os=android
make clean
make install
echo "compile ffmpeg end"
}
build_android
修改权限并执行脚本:
sh
chmod 777 build32.sh
./build32.sh
编译成功后会在上面脚本里面prefix指定的目录下生成三个文件夹
- include 头文件
- lib 静态库
- share 暂时不用
集成
导入到AS

编写CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.4.1)
add_library(
xplayer
SHARED
x-player.cpp)
# 引入FFmpeg头文件
include_directories(${CMAKE_SOURCE_DIR}/ffmpeg/include)
# 引入FFmpeg库文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/ffmpeg/${CMAKE_ANDROID_ARCH_ABI}")
find_library(
log-lib
log)
# 链接到总库 xplayer.so
target_link_libraries(
xplayer
# 需要保持这个顺序(忽略顺序可以使用 -Wl,--start-group -Wl,--end-group)
avformat avcodec avfilter avutil swresample swscale
${log-lib})
测试代码
cpp
#include <jni.h>
#include <string>
extern "C" {
#include "libavutil/avutil.h"
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_sun_xplayer_MainActivity_getVersion(JNIEnv *env, jobject thiz) {
std::string version = "ffmpeg version: ";
//获取FFmpeg版本号
version.append(av_version_info());
return env->NewStringUTF(version.c_str());
}
kotlin
init {
System.loadLibrary("xplayer")
}
external fun getVersion():String
fun printFFmpegVersion() {
Log.d("XPlayer", getVersion())
//ffmpeg version: 4.0.2
}
成功打印说明OK了