ndk开发-ffmpeg编译

进入模拟器shell:

D:\Users\zhouhaitao\AppData\Local\Android\sdk\platform-tools\adb shell


ndk编译链接静态库:

LOCAL_STATIC_LIBRARIES := avformat postproc swscale avfilter avcodec avutil swresample

注意库的名字省略了前缀lib和后缀.a,如库libavformat.a。


工具链使用:

arm-linux-androideabi-addr2line  -e libxxx.so 0x#####(address)


FFMPEG编译配置:

config.h定义了编译代码的开关,用于.c文件代码中某些语句是否编译。

config.mak定义了编译文件的开关,用于定义那些c文件是否编译。

默认情况下,config.h和config.mak都是由configure.sh脚本文件产生的。因此,在uplayer中,如果需要添加编译的模块,需要手动修改这两个文件。


关于config.h中的IS_ENABLE_H宏,和config.mak中的IS_ENABLE_MK,两个开关并没有完全很好的定义,如果两个开关都为0,是可以编译出裁剪后的ffmpeg库,但如果同时打开,会有编译问题。因为有些宏在.h中打开了,但在config.mak中却实际上是disable了的,因此会链接找不到。


config.mak的修改:

CONFIG_RTPDEC=yes

CONFIG_VP3DSP=yes

CONFIG_RTP_PROTOCOL=yes

CONFIG_RANGECODER=yes


config.h的修改

#define CONFIG_RTPDEC 1

#define CONFIG_VP3DSP 1

#define CONFIG_RTP_PROTOCOL 1

#define CONFIG_RANGECODERS 1


build_android.sh

#!/bin/bash
NDK=/usr/local/android-ndk-r10d
SYSROOT=$NDK/platforms/android-15/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm"
build_one

用ndk编译可执行程序:

1. 创建好ndk环境后,建立一个jni目录

2. 创建Android.mk和Application.mk文件

LOCAL_PATH := $(call my-dir)

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES := libavformat.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES := libavutil.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE	:= decoding
LOCAL_SRC_FILES	:= decoding_encoding.c
LOCAL_C_INCLUDES += \
	$(LOCAL_PATH)/. \
	$(LOCAL_PATH)/../ \
	$(LOCAL_PATH)/../libavutil \
	$(LOCAL_PATH)/../libavformat \
	$(LOCAL_PATH)/../libavcodec 

LOCAL_LDLIBS	+= -llog -lz -lm -lcrypto -lssl
LOCAL_STATIC_LIBRARIES := avformat avcodec avutil m

include $(BUILD_EXECUTABLE)

#$(call import-module,$(LOCAL_PATH))

APP_ABI := armeabi-v7a
APP_PLATFORM := android-23
TARGET_ARCH := arm
TARGET_ARCH_ABI := armeabi-v7a


静态链接ffmpeg库:

静态链接顺序非常重要,否则会报很多undefined reference错误。

lavformat、lavdevice、lavcodec、lavutil、lpthread、lswscale

2)编译ScreenShot.c文件,该截图程序需要调用ffmpeg的api。编译命令如下:


gcc -I/home/wavelet/workspace/install/ffmpeg-2013/include -L/home/wavelet/workspace/install/ffmpeg-2013/lib -o screenshot_static ScreenShot.c -lavformat -lavdevice -lavcodec -lavutil -lpthread -lswscale -lz -lm


来源: http://nkwavelet.blog.163.com/blog/static/2277560382013111335627/

3. 执行ndk-build


编译遇到的问题:

1. ffmpeg静态库的链接顺序要正确。

2. 在Android.mk中注意添加动态链接系统库:

LOCAL_LDLIBS += -llog -lz -lm

3. 编译ffempg库的目标平台版本,和编译链接ffmpeg的程序的目标平台版本一定要是一致,或者后者要高,如都是"APP_PLATFORM := android-23"\

4. 打开ndk-build脚本的log:    ndk-build NDK_LOG=1 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值