FFmpeg Android 添加依赖库

1 添加方式

./configure中通过--extra-cflags指定库头文件路径,通过--extra-ldflags指定链接库路径,形式如下:

./configure --extra-cflags="-I/path/to/my/lib/include" --extra-ldflags="-L/path/to/my/lib/lib" ...

如需明确指定可采用--extra-ldflags="-L/path/to/my/lib/lib -llibxxx.so /path/to/my/lib/lib/libxxx.a"的形式

2 可能问题

  1. undefined reference to __gxx_personality_v0
    问题原因: 未包含C++库(ffmpeg默认gcc编译)
    解决方法:--extra-ldflags中添加-lstdc++,若仍存在,可以考虑使用$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ANDROID_ARCH_ABI/libgnustl_shared.so-l$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ANDROID_ARCH_ABI/libgnustl_static.a

  2. sys/sysctl.h: no such files or dictionary
    问题原因:为了解决前一问题使用了-share参数,冲突
    解决办法:去掉该参数,使用libgnustl_shared.so

  3. [ aaccodec / hevc_mvs ] error: expected identifier or '(' before numeric constant int B0 = 0...
    问题原因:ffmpeg与ndk中B0重定义了
    解决方法:直接将报错文件中B0全部替换,如:BX0

  4. [ hevc_mvs ] error: 'y0000000' undeclared
    问题原因:前一问题只修改了报错部分,没替换全

3 最终脚本范例

外部依赖以libavs2为例,最终一步是打包成.so文件

#!/bin/sh

# For arm64, install libc6-dev-i386 first.

build_dir=$(pwd)

AVS2SRC=$build_dir/ffmpeg_avs2_lib
PREFIX=$build_dir/ffmpeg_avs2_lib
ARCH=arm64
SDK_VERSION=24 # only SDK>=21 support arm64
FFMPEG_SRC=FFmpegAVS2
NDK="/home/rew/Android/android-ndk-r14b"

export PKG_CONFIG_PATH=/home/rew/Rew/AVS2/cavs2dec_hwren/build/linux/android/arm/lib/pkgconfig


if [ "$ARCH" = "arm64" ]
then
    PLATFORM_PREFIX="aarch64-linux-android"
    HOST="aarch64"
    PLATFORM_VERSION=4.9
    ABI="arm64-v8a"
    EXTRA_CFLAGS="-march=armv8-a -O3 -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ -DPIC \
                  -flax-vector-conversions -Wunused-variable -fPIE -pie"
else
    PLATFORM_PREFIX="arm-linux-androideabi"
    HOST="arm"
    PLATFORM_VERSION=4.9
    ABI="armeabi-v7a"
    EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon -marm -mtune=cortex-a8 -fPIE -pie \
                  -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ -flax-vector-conversions -Wunused-variable"
fi

NDKROOT=$NDK/platforms/android-${SDK_VERSION}/arch-${ARCH}
TOOLCHAIN=$NDK/toolchains/${PLATFORM_PREFIX}-${PLATFORM_VERSION}/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/${PLATFORM_PREFIX}-
EXTRA_LDFLAGS="-fPIE -pie -llog -landroid $NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ABI/libgnustl_shared.so"


build_one(){
./configure \
    --target-os=linux \
    --prefix=$PREFIX \
    --enable-cross-compile \
    --extra-libs="-lgcc" \
    --arch=$ARCH \
    --cross-prefix=$CROSS_PREFIX \
    --cc=${CROSS_PREFIX}gcc \
    --nm=${CROSS_PREFIX}nm \
    --sysroot=$NDKROOT \
    --extra-cflags="-I$NDKROOT/usr/include -I$AVS2SRC/include -O3 -fpic  \
    -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm \
    -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300  \
    $EXTRA_CFLAGS" \
    --extra-ldflags="-Wl,-rpath-link=$NDKROOT/usr/lib -L$NDKROOT/usr/lib -lc  \
    -lm -ldl -llog -lstdc++ $AVS2SRC/lib/libdavs2.a -L$AVS2SRC/lib -ldavs2    \
    $EXTRA_LDFLAGS"   \
    --enable-gpl \
    --enable-libdavs2 \
    --enable-neon \
    --enable-asm \
    --disable-shared \
    --enable-static \
    --disable-debug \
    --disable-linux-perf \
    --pkg-config=/usr/bin/pkg-config 
}

cd $FFMPEG_SRC

make distclean
build_one || exit 1
(make -j16 && make install) || exit 1

${CROSS_PREFIX}ld -z muldefs -rpath-link=$NDKROOT/usr/lib \
-L$NDKROOT/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic \
--whole-archive --no-undefined -o $PREFIX/libffmpeg.so $AVS2SRC/lib/libdavs2.a  \
libavcodec/libavcodec.a libavfilter/libavfilter.a libswresample/libswresample.a  \
libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a \
libpostproc/libpostproc.a libavdevice/libavdevice.a -fPIC -lc -lm -lz -ldl -llog \
$NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ABI/libgnustl_shared.so -lstdc++ \
--dynamic-linker=/system/bin/linker $TOOLCHAIN/lib/gcc/$PLATFORM_PREFIX/4.9.x/libgcc.a

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 大妞,是我的好姐们儿,大一进入尾声我们开始黏在一起,此后便再也甩不掉了,这妞,我和小妞一致认为,若是在唐朝定是个美...
    chanlings阅读 386评论 0 0
  • 1. 什么是DOCTYPE及作用? DTD是一系列的语法规则,用来定义XML或HTML的文件类型。浏览器会使用它来...
    王小滚阅读 2,202评论 0 1
  • 站着是1 躺下是一 只要不低头 不弯腰 不屈膝 就永远是 开天的那一画
    化十文化阅读 238评论 0 0
  • 欢乐颂第二季开播了,即便广告变得多如牛毛,但热度依旧居高不下。有影评者说这是一部玛丽苏式展现富人阶层生活品味,却把...
    泽西_阅读 335评论 0 2
  • 昨天送娃上课,看了这本书50%,颇有感触,很不错的一本供应链领域入门读物,与其一上来就是很大部头的名词和模式,这本...
    笑颜明心阅读 1,321评论 0 0