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

[html] view plain  copy
 
  1. #!/bin/bash  
  2. NDK=/usr/local/android-ndk-r10d  
  3. SYSROOT=$NDK/platforms/android-15/arch-arm/  
  4. TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64  
  5. function build_one  
  6. {  
  7. ./configure \  
  8.     --prefix=$PREFIX \  
  9.     --enable-shared \  
  10.     --disable-static \  
  11.     --disable-doc \  
  12.     --disable-ffmpeg \  
  13.     --disable-ffplay \  
  14.     --disable-ffprobe \  
  15.     --disable-ffserver \  
  16.     --disable-avdevice \  
  17.     --disable-doc \  
  18.     --disable-symver \  
  19.     --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \  
  20.     --target-os=linux \  
  21.     --arch=arm \  
  22.     --enable-cross-compile \  
  23.     --sysroot=$SYSROOT \  
  24.     --extra-cflags="-Os -fpic $ADDI_CFLAGS" \  
  25.     --extra-ldflags="$ADDI_LDFLAGS" \  
  26.     $ADDITIONAL_CONFIGURE_FLAG  
  27. make clean  
  28. make  
  29. make install  
  30. }  
  31. CPU=arm  
  32. PREFIX=$(pwd)/android/$CPU   
  33. ADDI_CFLAGS="-marm"  
  34. build_one  

用ndk编译可执行程序:

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

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

[html] view plain  copy
 
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. LOCAL_ALLOW_UNDEFINED_SYMBOLS := true  
  4.   
  5. include $(CLEAR_VARS)  
  6. LOCAL_MODULE := avformat  
  7. LOCAL_SRC_FILES := libavformat.a  
  8. include $(PREBUILT_STATIC_LIBRARY)  
  9.   
  10. include $(CLEAR_VARS)  
  11. LOCAL_MODULE := avcodec  
  12. LOCAL_SRC_FILES := libavcodec.a  
  13. include $(PREBUILT_STATIC_LIBRARY)  
  14.   
  15. include $(CLEAR_VARS)  
  16. LOCAL_MODULE := avutil  
  17. LOCAL_SRC_FILES := libavutil.a  
  18. include $(PREBUILT_STATIC_LIBRARY)  
  19.   
  20. include $(CLEAR_VARS)  
  21. LOCAL_MODULE    := decoding  
  22. LOCAL_SRC_FILES := decoding_encoding.c  
  23. LOCAL_C_INCLUDES += \  
  24.     $(LOCAL_PATH)/. \  
  25.     $(LOCAL_PATH)/../ \  
  26.     $(LOCAL_PATH)/../libavutil \  
  27.     $(LOCAL_PATH)/../libavformat \  
  28.     $(LOCAL_PATH)/../libavcodec   
  29.   
  30. LOCAL_LDLIBS    += -llog -lz -lm -lcrypto -lssl  
  31. LOCAL_STATIC_LIBRARIES := www.douniu178.com   avformat avcodec avutil m  
  32.   
  33. include $(BUILD_EXECUTABLE)  
  34.   
  35. #$(call import-module,$(LOCAL_PATH))  
[html] view plain  copy
 
  1. APP_ABI := armeabi-v7a  
  2. APP_PLATFORM := android-23  
  3. TARGET_ARCH := arm  
  4. TARGET_ARCH_ABI := www.duobaoyule2.cn armeabi-v7a  



静态链接ffmpeg库:

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

lavformat、lavdevice、lavcodec、lavutil、lpthread、lswscale库

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

 
[plain] view plain  copy
 
  1. 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 -www.ysgj1688.com/ lz -lm  
  2.   
  3.   
  4. 来源: http://nkwavelet.blog.163.com/blog/static/ www.baohuayule.net  2277560382013111335627/  

3. 执行ndk-build

编译遇到的问题:

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

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

[plain] view plain  copy
 
  1. LOCAL_LDLIBS += -llog -lz -lm  

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

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

猜你喜欢

转载自www.cnblogs.com/qwangxiao/p/9029524.html