ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程。
环境准备:
Ubuntu12.04 TLS
android-ndk-r9d-linux-x86_64.tar.bz2
ffmpeg2.2
---------------------------------------------------------
第一步:下载
1.配置ubuntu12.04 TLS 系统环境。
2.下载ndk版本为 r9d。
3.下载ffmpeg2.2版本。
第二步:在ubuntu下编译环境设置
1. 安装好ubuntu12.04 TLS 64位linux系统之后,可以选择安装一下内容:
在在参考一些其他有关linux下NDK环境搭建资料上看到64位ubuntu 安装之后需要再下载 bison
64位ubuntu下还需要下载 gcc-multilib 和g++-multilib:
终端命令:" sudo apt-get install bison gcc-multilib g++-multilib "
2.下载ndk之后解压后目录:/home/admin/develop/android-ndk-r9d
配置NDK环境变量:
(2.) 配置NDK的环境变量:
终端内执行:“ gedit ~/.bashrc ”
在打开的文件末尾添加如下内容:
NDK=/home/admin/develop/android-ndk-r9d
export NDK
(3.)在当前bash环境下读取并执行 ~/.bashrc 中的命令:
终端执行:" source ~/.bashrc "
(4.)查看是否生效:
终端执行: " echo $NDK "
结果:/home/test/develop/android-ndk-r9d
(5.)测试NDK编译JNI工程:
到android-ndk-r9d 的sample目录的hello-jni 目录里
终端执行:“ $NDK/ndk-build ”
如果环境配置成功会生成so库的。
3.解压ffmpeg-2.2源码
将ffmpeg-2.2.tar.gz解压后拷贝到任意目录,本例是拷贝到.../android-ndk-r9d/sample/ffmpeg2.2 目录内。
拷贝之后添加" build_android.sh "文件:
#!/bin/bash
SYSROOT=$NDK/platforms/android-/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffserver \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
有的资料上面 build_android.sh 的前几行是这样写的:
#!/bin/bash
NDK=/home/admin/develop/android-ndk-r9d
SYSROOT=$NDK/platforms/android-/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 .....
.....
因为之前已经在linux下设置NDK的环境路径,所以就不需要在build_android.sh里指定NDK的路径了。
在编译ffmpeg的时候推荐先设置NDK的环境路径到系统环境中,因为如果不设置的话,使用" NDK=/home/admin/... " 个人感觉是非常恶心的,尤其是在windows下使用cygwin编译的时候经常出现NDK路径找不到的问题,所以windows下编译最好也配置好NDK环境路径。
修改configure文件:
很多ffmpeg编译资料上面说要修改configure文件 ,说的原因是 如果不修改的话,在android上 System.loadLibrary("xxx"); 的时候个别so库无法加载的问题。
打开 ffmpeg源码内 configure 文件进行如下修改:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)' 替换为: SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)'
第三步:在ubuntu 64位下进行编译ffmpeg源码以得到android平台 arm下能使用的那几个so库
1.给build_android.sh 和 configure 增加可执行权限:
终端执行:
“ $chmod+x ./build_android.sh ”
“ $chmod+x ./configure ”
2.给build_android.sh 和 configure 转换格式:
终端执行:(需要先安装 dos2unix)
“ $dos2unix ./build_android.sh ”
“ $dos2unix ./configure ”
3.最后编译:
终端执行:
“ $ ./build_android.sh ”
“ $ make ”
“$ make install ”
----------------------
编译成功会在ffmpeg源码目录下生成一个“android”目录里面有编译好的 so库和 需要的头文件等等。
其中so库应该是一下几个:
libavutil-.so
libavcodec-.so
libswresample-.so
libavformat-.so
libswscale-.so
libpostproc-.so
libavfilter-.so
libavdevice-.so
第四步:android下使用这几个库:
----------------------------------------------------
1.使用NDK里sample目录下的hello-jni 工程进行使用这几个库:
(a.)在hello-jni 源码的JNI目录下新建ffmpeglib目录,把那几个库全部拷贝到 /hello-jni/jni/ffmpeglib/ 目录下。
(b.)然后把编译好的ffmpeg的头文件全部拷贝到 /hello-jni/jni/ 目录下。
(c.)在 hello-jni.c 文件内进行使用ffmpeg:
#include <string.h>
#include <jni.h> #include <libavcodec/avcodec.h> jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
char str[];
sprintf(str, "%d", avcodec_version()); return (*env)->NewStringUTF(env, str);
}
(d.)在 HelloJni.java 文件加载so库进行调用JNI内的测试函数:
static
{ System.loadLibrary("avutil-52");
System.loadLibrary("avcodec-55");
System.loadLibrary("swresample-0");
System.loadLibrary("avformat-55");
System.loadLibrary("swscale-2");
System.loadLibrary("postproc-52");
System.loadLibrary("avfilter-4");
System.loadLibrary("avdevice-55");
System.loadLibrary("hello-jni"); } public native String stringFromJNI();
(e.)修改 hello-jni 源码中jni目录下的 Android.mk 文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
LOCAL_MODULE := avcodec--ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libavcodec-.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := avdevice--ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libavdevice-.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := avfilter--ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libavfilter-.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := avformat--ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libavformat-.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := avutil--ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libavutil-.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := avswresample--ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libswresample-.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := swscale--ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libswscale-.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := postproc--ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libpostproc-.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid
LOCAL_SHARED_LIBRARIES := avcodec--prebuilt avdevice--prebuilt avfilter--prebuilt avformat--prebuilt avutil--prebuilt swscale--prebuilt postproc--prebuilt avswresample--prebuilt include $(BUILD_SHARED_LIBRARY)
(f.)windows下使用cygwin编译hello-jni工程:
" $NDK/ndk-build "
生成 libhello-jni.so 完成。
----------------------------------------
附上ubuntu下编译好的所有so库和头文件:
http://download.csdn.net/detail/wain163/7494547
!!!==========================================
针对之前有的小伙伴说使用hello-jni测试 NDK-r9编译好的最新的FFmpeg2.2的所有so库和头文件 的时候。
在使用cygwin编译jni的时候会报错:”undefined reference to 'avcodec_version'“ 的问题,所以现在把本人在hello-jni的程序弄上来,供大家参考。
hello-jni工程地址:
http://download.csdn.net/detail/wain163/8859195
备注:
此demo需要在 HelloJni.java 中加上:
static {
System.loadLibrary("avutil-52");
System.loadLibrary("avcodec-55");
System.loadLibrary("swresample-0");
System.loadLibrary("avformat-55");
System.loadLibrary("swscale-2");
System.loadLibrary("postproc-52");
System.loadLibrary("avfilter-4");
System.loadLibrary("avdevice-55");
System.loadLibrary("hello-jni");
}
并且需要cygwin 对jni进行编译 出so才能运行。
==========================================
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考资料:
http://blog.csdn.net/gobitan/article/details/22750719
ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用的更多相关文章
- Linux下使用NDK编译FFMPEG(libstagefright)
这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启 ...
- 【转】在Ubuntu上下载、编译和安装Android最新源代码
原文网址:http://blog.csdn.net/luoshengyang/article/details/6559955 看完了前面说的几本书之后,对Linux Kernel和Android有一定 ...
- 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6564592 在前一篇文章提到,从源代码树下载下 ...
- 在Ubuntu上下载、编译和安装Android最新源代码
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6559955 看完了前面说的几本书之后,对Lin ...
- 使用android ndk编译x86 so在linux下使用的问题
一直以为android ndk编译x86 so库可以在linxu下运行,结果我试了几次都行不通.后来想了一下,android ndk编译的库应该只能在android设备或模拟器上运行才有效,后来改用 ...
- 用 eclipse ndk 编译 cocos2d-x for Android
Android 环境搭建不详述,,可以google,,, 我用的coco2dx 是 2.14 ,2.14 用 create_project.py 脚本创建工程,Python环境配置也是很简单,这里了不 ...
- 在Ubuntu上下载、编译和安装Android最新源码
看完了前面说的几本书之后,对Linux Kernel和Android有一定的认识了,是不是心里蠢蠢欲动,想小试牛刀自己编译一把Android源码了呢?一直习惯使用Windows系统,而Android源 ...
- 【转】NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。
原文网址:http://blog.csdn.net/hxdanya/article/details/39371759 由于使用了NDK编译的可执行文件在应用中调用,在4.4及之前的版本上一直没出问题. ...
- NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。
由于使用了NDK编译的可执行文件在应用中调用,在Android 7.0上的运行情况发现,当运行该可执行文件时,报如下错误: error: only position independent execu ...
随机推荐
- OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)
公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...
- 论那些年我们讨论过的Bank系统!
今天呢我就和大家分享一下怎样用对象数组的形式来实现一个简单的银行系统, 首先呢,跟大家介绍一下这个简单的银行操作系统要实现的一些主要的功能: 主要功能有 : 1.开户功能 2.存款 3.取款 4.转账 ...
- 虚拟机安装CentOS6.3两个问题
虚拟机下CentOS安装教程:http://blog.csdn.net/21aspnet/article/details/6961518 由于前一阵子重新装win7,win7下的虚拟机CentOS也就 ...
- Mvc下异步断点续传大文件
最近公司一同事咨询了一个MVC项目下上传大文件时遇到的问题,问题描述如下: MVC项目中,当上传比较大的文件时,速度非常慢,小文件基本没有影响. 原因分析: 如果是用传统的form表单去提交的话,会将 ...
- weblogic 12c下jxls导出excel报错Could not initialize class org.apache.poi.xssf.usermodel.XSSFVMLDrawing
周一,开发反馈weblogic 12c下jxls导出excel报错,公司环境和UAT环境均报错,看日志如下: 2016-06-08 09:16:55,825 ERROR org.jxls.util.T ...
- pace.js和NProgress.js两个加载进度插件的一点小总结
这两个插件都是关于加载进度动画的,应该说各有特点吧,最起码对我来说是各有优势的.今天一天就捣鼓了加载进度动画,也研究了大量的(也就这两个)加载进度动画,也算对加载进度动画有了一个初步的了解了吧. NP ...
- [js开源组件开发]js轮播图片支持手机滑动切换
js轮播图片支持手机滑动切换 carousel-image 轮播图片,支持触摸滑动. 例子见DEMO http://www.lovewebgames.com/jsmodule/carousel-ima ...
- php对mysql数据库简单连接操作
前些阵子忙完了公司前端静态页面的事情了之后,简单学习了下php的基础知识,今天想了想回顾一下php连接数据库的方式,写一下随笔存一下看看 php连接数据库端口和新建数据库 <?php $serv ...
- andriod 动态显示当前时间
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android=&quo ...
- 对抗静态分析——运行时修复dex
对抗静态分析——运行时修复dex 本文来源:i春秋社区-分享你的技术,为安全加点温度 零.写在前面 这个系列本来题目想写对抗反编译,可是想想对抗反编译的这个范围有点大,总结如下 灵魂作图 ...