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 := www.douniu178.com 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 := www.duobaoyule2.cn 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 -www.ysgj1688.com/ lz -lm
- 来源: http://nkwavelet.blog.163.com/blog/static/ www.baohuayule.net 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
ndk开发-ffmpeg编译的更多相关文章
- Ndk开发笔记
<pre name="code" class="cpp">ndk开发: 1.编译android本地程序的二种方法.q 2.安装ndk编译工具. 3. ...
- 使用Android Studio进行ndk开发的准备
1. gradle-ex2. ndk开发包3. 项目目录结构4. lldb调试器 1. 一般来说gradle不是必需的,gradle也是可以进行ndk编译的,然而你需要在编译时使用更多(多于一个)c+ ...
- Windows下搭建Android NDK开发环境及命令行编译
首先说明本文内的相关安装操作参考<Pro Android C++ with the NDK>一书. 安装 Windows搭建Android NDK开发环境需要安装如下部分(同时需要配置对应 ...
- windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)
郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...
- Android NDK 开发(一)--环境搭建【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41800955 Android下的NDK开发是Android开发中不可或缺的一部分, ...
- android studio下的NDK开发详解(一)
源地址:http://www.voidcn.com/blog/chengkaizone/article/p-5761016.html 好记性不如烂笔头,开始坚持写博客,学一点记一点,只为了生活更好. ...
- 搞NDK开发
1.哪些场景下要用到NDK开发? 跨平台的库,如FFmpeg, skip,weex, 加固,防逆向 签名校验 图片压缩 音视频解码 OpenGL ES 高级特效 热修复 andfix 人脸识别 fac ...
- Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器
基于NDK开发Android平台RTSP播放器 最近做了不少android端的开发,有推流.播放.直播.对讲等各种应用,做了RTMP.RTSP.HTTP-FLV.自定义等各种协议,还是有不少收获和心得 ...
- NDK开发_笔记0
自谷歌搜索退出中国以来,谷歌对全球第二大市场中国的态度一直保持冷淡.可是北京时间12月8日,谷歌2016开发者大会在北京召开,同时专门针对中国的谷歌开发者网站已经上线:https://develope ...
随机推荐
- 封装动态数组类Array
功能: 1.增.删.改.查 2.扩容.缩容 3.复杂度分析 4.均摊复杂度 5.复杂度震荡 分析动态数组的时间复杂度: 分析resize的时间复杂度: public class Array<E& ...
- 【c学习-3】
---恢复内容开始--- #include<stdio.h> int main(){ ]={,,,,}; ; ;i<=;i++){ printf("%d\n",a ...
- redis数据库的安装配置
redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcached类似,但很大程度补偿了memcached的不足,它支持存储的value类型相对更多,包括strin ...
- Redis------Set集合类型
set是string类型的无序集合 类比:你的朋友不能超过2的32次方-1个元素 基本添加删除操作 取并集 取交集 取差集 注意:每个元素的各个元素不能重复 应用场合:qq好友推荐‘ TomFri 的 ...
- Maven系列之快速入门
文章结构 唯快不破---Maven快速入门 稳打稳扎---Maven核心知识 实用为先---Maven如何建立Web项目 1 唯快不破---Maven快速入门 1.1 Maven项目 ...
- Android 如何在xmL 里面动态设置padding
如题,Android 如何在xmL 里面动态设置padding 有时候,你的布局加载完成之后,你findViewByid 找到控件,设置padding 会导致白条,布局闪动,那怎么办呢? 你是不是就想 ...
- TP5 中出现 No input file specified
之前用php5.4 更新至php7之后原tp5项目出现 No input file specified 修改方法: 打开public目录下的.htaccess文件,把:RewriteRule ^(.* ...
- idea无法新建maven项目
之前用的都是eclipse,自从4月底入职新公司后,接触到了idea. 然后自己的电脑上也安装了idea,不过一直都没用,直到昨天打算开起来使用一下. 之后就是想新建一个maven项目,发现死活也新建 ...
- C#正则表达式引发的CPU跑高问题以及解决方法
3月23日(周日)下午16:30左右,博客园主站负载均衡中的2台Web服务器CPU玩起了爬楼梯的游戏(见上图),一直爬到了接近100%.发现这个状况后,我们立即将这2台阿里云临时磁盘云服务器从负载均衡 ...
- 《Cracking the Coding Interview》——第7章:数学和概率论——题目1
2014-03-20 01:57 题目:玩篮球投篮,有两种玩法:要么1投1中,要么3投两中.你单次投篮中的概率是p,那么对于不同的p,哪种玩法胜率更高? 解法:第一种总是胜率更高,可以列不等式算算,结 ...