1. ffmpeg usa gcc para compilar de forma predeterminada, no se puede usar en Android; de lo contrario, se informarán varios errores, así que use el sonido metálico de ndk para compilar
2. Descargue el código fuente de ffmpeg
, modifique el archivo de configuración, agregue el comando cross_prefix_clang
y modifique el siguiente comando
cc_default="${cross_prefix}${cc_default}"
cxx_default="${cross_prefix}${cxx_default}"
después de la modificación
cc_default="${cross_prefix_clang}${cc_default}"
cxx_default="${cross_prefix_clang}${cxx_default}"
3. Cree un nuevo archivo de script y ejecútelo en el directorio ffmpeg.
Para compilar 32 bits, cambie ARCH a arm, CPU a armv7-a y TARGET a armv7a-linux-androideabi
Tenga en cuenta que la versión r25 de ndk eliminó la herramienta de compilación cruzada y la cambió a llvm, por lo que la herramienta de compilación cruzada la ruta debe cambiarse ruta a llvm
#!/bin/bash
set -x
# 目标Android版本
API=21
ARCH=arm64
CPU=armv8-a
TARGET=aarch64-linux-android
#so库输出目录
OUTPUT=/root/Desktop/compile/ffmpeg/build_$CPU
#NDK路径
NDK=/root/Desktop/compile/ndk/android-ndk-r25c
#NDK=/root/Desktop/compile/ndk/android-ndk-r20b
# 编译工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# 编译环境
SYSROOT=$TOOLCHAIN/sysroot
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD"
#point build to llvm
ln -s $TOOLCHAIN/bin/llvm-ar $TOOLCHAIN/bin/$TARGET-ar
ln -s $TOOLCHAIN/bin/llvm-nm $TOOLCHAIN/bin/$TARGET-nm
ln -s $TOOLCHAIN/bin/llvm-ranlib $TOOLCHAIN/bin/$TARGET-ranlib
ln -s $TOOLCHAIN/bin/llvm-strip $TOOLCHAIN/bin/$TARGET-strip
function build
{
./configure \
--prefix=$OUTPUT \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-vulkan \
--sysroot=$SYSROOT \
--cross-prefix=$TOOLCHAIN/bin/$TARGET- \
--cross-prefix-clang=$TOOLCHAIN/bin/$TARGET$API- \
make clean all
make install
}
build
4. Importación de estudio de Android
5. Configuración de cmake
cmake_minimum_required(VERSION 3.22.1)
# Declares and names the project.
project("teskndk")
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#include_directories(${
CMAKE_CURRENT_SOURCE_DIR}/include)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/")
add_library( # Sets the name of the library.
teskndk
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp)
add_library(avcodec SHARED IMPORTED)
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${
CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${
ANDROID_ABI}/libavcodec.so)
add_library(avdevice SHARED IMPORTED)
set_target_properties(avdevice PROPERTIES IMPORTED_LOCATION ${
CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${
ANDROID_ABI}/libavdevice.so)
add_library(avfilter SHARED IMPORTED)
set_target_properties(avfilter PROPERTIES IMPORTED_LOCATION ${
CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${
ANDROID_ABI}/libavfilter.so)
add_library(avformat SHARED IMPORTED)
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${
CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${
ANDROID_ABI}/libavformat.so)
add_library(avutil SHARED IMPORTED)
set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${
CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${
ANDROID_ABI}/libavutil.so)
add_library(swresample SHARED IMPORTED)
set_target_properties(swresample PROPERTIES IMPORTED_LOCATION ${
CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${
ANDROID_ABI}/libswresample.so)
add_library(swscale SHARED IMPORTED)
set_target_properties(swscale PROPERTIES IMPORTED_LOCATION ${
CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${
ANDROID_ABI}/libswscale.so)
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
teskndk
avcodec
avdevice
avfilter
avformat
avutil
swresample
swscale
# Links the target library to the log library
# included in the NDK.
${
log-lib})
ejecutar con éxito