Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277912
  • 博文数量: 182
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1292
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-06 19:02
个人简介

让一切的准备都完美演出,让所有的努力都美好落幕

文章分类

全部博文(182)

文章存档

2016年(60)

2015年(122)

我的朋友

分类: LINUX

2016-03-31 14:27:58

之前尝试过Android ndk编译ffmpeg移植,但这个例子是生成多个so文件的。如果想最后只生成一个libffmpeg.so,要怎样做呢?
其实很简单,写一个脚本就ok了!
这里是利用cygwin在windows下实现的。
用Cygwin编译FFMpeg,与在linux中有点类似,只不过,对于NDK的路径配置有点不一样。还有,最最主要的是,需要设置一下临时目录的环境变量,最初就是没设置这玩意,怎么都编译不过。
1.首先创建目录 ffmpeg,然后解压 ffmpeg-1.2 到 ffmpeg 目录正面:tar xvf ffmpeg-1.2.1.tar.gz -C ./ffmpeg
2.然后重命名 ffmpeg-1.2.1 为 jni:cd ffmpeg && mv ffmpeg-1.2.1 jni
3.在jni 目录创建 config.sh,并输入以下内容:
#!/bin/bash
NDK_HOME=C:/android-ndk-r9d-windows-x86/android-ndk-r9d
PREBUILT=$NDK_HOME/toolchains/arm-linux-androideabi-4.6/prebuilt/windows
PLATFORM=$NDK_HOME/platforms/android-9/arch-arm


function build_one
{
./configure --target-os=linux \
--arch=arm \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-ffprobe \
--disable-symver \
--enable-encoders \
--enable-decoders \
--enable-muxers \
--disable-devices \
--disable-protocols \
--enable-protocol=file \
--enable-avfilter \
--enable-network \
--enable-avdevice \
--disable-asm \
--enable-cross-compile \
--enable-runtime-cpudetect \
--sysroot=$PLATFORM \
--disable-everything \
--disable-doc \
--enable-avresample \
--enable-demuxer=rtsp \
--enable-muxer=rtsp \
--enable-protocol=rtp \
--enable-hwaccels \
--enable-zlib \
--prefix=$PLATFORM/usr \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--extra-cflags="-I$PLATFORM/usr/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
--extra-ldflags="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PLATFORM/usr/lib/crtbegin_dynamic.o $PLATFORM/usr/lib/crtend_android.o -lc -lm -ldl" \


make -j4 install


rm -rf ../libs && mkdir ../libs && mkdir ../libs/armeabi
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffmpeg.so -shared -nostdlib  -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $PLATFORM/usr/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.6/libgcc.a
cp $PLATFORM/usr/libffmpeg.so ../libs/armeabi
}
build_one

NDK要换成你NDK对应的本地路径编写config脚本时候,其中的路径需要使用windows形式的路径,不能使用/cygwindriver/d/android 这种格式的路径PLATFORM和PREBUILT中的路径与你安装的NDK的版本有关。这里还要注意的一点是,不建议用记事本来创建编辑这个文件,可能用Notepad或Editplus之类的文本编辑器,因为Cygwin是模拟linux环境,linux和win的编码还是有那么点小区别的。
准备工作完成后,打开Cygwin,cd到ffmpeg目录下。接下来是设置临时目录环境变量
$ export TMPDIR=C:/cygwin/tmp(可随意)
执行config.sh时可能出现的问题一般有两种,一种是NDK的路径错误(请仔细检查),另一种是未执行 export  TMPDIR
再后面和linux一样,为config.sh赋予执行权限,然后直接./config.sh编译

过10-30分钟即可以 ffmpeg/libs/armeabi 目录下载找到 libffmpeg.so 文件,大概5M多。

恭喜你,可以写自己的 jni 调用了。

备注:我主要参考了两篇文章如下:
http://zengwu3915.blog.163.com/blog/static/27834897201462754426390/
http://www.cnblogs.com/lyout/p/3279997.html
这里,谢过两位大神。
主要说一下我的问题,我按照上面说的还是报错
arm-linux-androideabi-4.8/prebuilt/windows/bin/arm-linux-androideabi-gcc-4.8 is unable to create an executable file.
C compiler test failed.
后来我把arm-linux-androideabi-4.8改为arm-linux-androideabi-4.6完美解决!!!

阅读(2062) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~