android jni 根目录 权限,Android NDK交叉编译FFMpeg和AndroidStudio项目配置权限、jni库路径、ABI...

Android NDK交叉编译FFMpeg

首先准备ffmpeg源码和原生开发工具包NKD, 以前是我使用的源码版本和NDK版本以及对应的下载链接

编写编译脚本

这是我所使用的编译参数

ffmpeg绝对路径 : /root/ff/ffmpeg-3.4

NDK绝对路径 : /root/ff/android-ndk-r14b

编译环境为ubuntu16.04

需要注意CRLF和LF的区别,否则可能导致脚本执行错误, 脚本需要添加执行权限

编译成功后会有/root/ff/ffmpeg-3.4/android/armv7-a, /root/ff/ffmpeg-3.4/android/armv7-a-neon-hard 两个文件夹

#!/bin/bash

echo "进入编译ffmpeg脚本"

NDK=/root/ff/android-ndk-r14b

#Android 5.0

PLATFORM=$NDK/platforms/android-21/arch-arm

#工具链

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

CPU=armv7-a

#输出路径

PREFIX=./android/$CPU

function buildFF

{

echo "开始编译ffmpeg"

./configure \

--prefix=$PREFIX \

--target-os=android \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--arch=arm \

--cpu=$CPU \

--sysroot=$PLATFORM \

--extra-cflags="$CFLAG" \

--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \

--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \

--enable-shared \

--enable-runtime-cpudetect \

--enable-gpl \

--enable-small \

--enable-cross-compile \

--disable-debug \

--disable-static \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-postproc \

--disable-avdevice \

--disable-symver \

--disable-stripping \

$ADD

make -j16

make install

echo "编译结束!"

}

###########################################################

echo "编译支持neon和硬解码"

CPU=armv7-a

PREFIX=./android/armv7-a-neon-hard

CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp "

ADD="--enable-asm \

--enable-neon \

--enable-jni \

--enable-mediacodec \

--enable-decoder=h264_mediacodec \

--enable-hwaccel=h264_mediacodec "

buildFF

###########################################################

echo "编译不支持neon和硬解码"

CPU=armv7-a

PREFIX=./android/$CPU

CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "

ADD=

buildFF

AndroidStudio项目配置权限、jni库路径、ABI

这是一个边试错便配置的过程

配置环境如下

Android Studio 3.5.3

雷电模拟器 Android 5.1版本

ffmpeg3.4

创建项目

创建新项目, 选择Natice C++

Snipaste_2020-03-25_22-40-29.png

Next, Minimum API level 选择 Android 5.0

Snipaste_2020-03-25_22-43-24.png

Next, C++ Standard 选择 C++11

Snipaste_2020-03-25_22-46-04.png

配置过程

首先在native-lib.cpp引入头文件, 此时编译错误为未找到头文件

Snipaste_2020-03-25_22-54-54.png

解决方法, 将编译生成的armv7-a-neon-hard下的include复制到CMakeList.txt所在目录, 然后在CMakeList.txt中添加头文件路径,编译通过

Snipaste_2020-03-25_23-02-13.png

Snipaste_2020-03-25_23-07-28.png

然后再native-lib.cpp中调用avcodec_configuration()获取ffmpeg配置信息, 此时编译会提示函数undefined未定义, 是因为未将ffmpeg的库引入, cmake无法找到对应函数的定义

Snipaste_2020-03-25_23-09-07.png

解决方法, 新建如下文件夹, 并将armv7-a-neon-hard/lib文件夹下的动态库复制到该文件夹, 然后再CMakeLists.txt文件中加入如下配置项引入ffmpeg库, 这边要在build.gradle(Moudle.app)中添加配置保证只编译对应abi的库

并将对应的库打包到apk中去

Snipaste_2020-03-25_23-18-20.png

Snipaste_2020-03-25_23-18-21.png

Snipaste_2020-03-25_23-34-14.png

最后编译运行得到如下结果即配置成功

Snipaste_2020-03-25_23-35-36.png

你可能感兴趣的:(android,jni,根目录,权限)