您的位置:首页 > 移动开发 > Android开发

FFmpeg的Android平台移植—编译篇

2017-07-04 08:51 603 查看
http://blog.csdn.net/gobitan/article/details/22750719

版权声明:本文为博主原创文章,未经博主允许不得转载。

FFmpeg的Android平台移植—编译篇
Dennis Hu 2014年3月28日
摘要:本文主要介绍将FFmpeg音视频编解码库移植到android平台上的编译和基本测试过程。

环境准备:

Ubuntu12.04 TLS

android-ndk-r9d-Linux-x86_64.tar.bz2

adt-bundle-windows-x86_64-20131030.zip

第一步:源代码下载

到FFmpeg官方网站http://www.ffmpeg.org/上去下载源代码,这里下载的源代码是最权威的。进入官网之后,选择”Download”进入下载页面,截止2014年3月28日止,最新的发布的稳定版本为FFmpeg2.2,代号”Muybridge”。选择该下方的”Downloadgzip tarball”进行下载,下载后的文件名为ffmpeg-2.2.tar.gz,大约8.3M。

第二步:在linux环境下编译FFmpeg

在Windows平台可以采用VMplayer虚拟机上安装ubuntu的方式,本人也是采用这种方式。

本文以/home/dennis为根目录进行操作和说明:

将ffmpeg-2.2.tar.gz拷贝至根目录,然后执行如下解压命令将其解压:

$tar zxf ffmpeg-2.2.tar.gz

解压后将得到/home/dennis/ffmpeg-2.2目录。

修改ffmpeg-2.2/configure文件

如果直接按照未修改的配置进行编译,结果编译出来的so文件类似libavcodec.so.55.39.101,版本号位于so之后,Android上似乎无法加载。因此需要按如下修改:

将该文件中的如下四行:

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)'

编写build_android.sh脚本文件

FFmpeg可以说是一个包络音视频编解码及格式的超级霸。因此在编译前通常都需要进行配置,设置相应的环境变量等。

所有的配置选项都在ffmpeg-2.2/configure这个脚本文件中,可以通过执行如下命令来查看所有的配置选项:

$ ./configure –help

配置选项很多,也较为复杂,这里先把我需要的搞出来,然后有时间再慢慢看。

我们将需要的配置项和环境变量设置写成一个sh脚本文件来运行以便编译出Android平台需要的so文件出来。

build_android.sh的内容如下:

[plain] view
plain copy

#!/bin/bash

NDK=/home/dennis/android-ndk-r9d

SYSROOT=$NDK/platforms/android-9/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

这个脚本文件有几个地方需要注意:

(1) NDK,SYSROOT和TOOLCHAIN这三个环境变量一定要换成你自己机器里的。

(2) 确保cross-prefix变量所指向的路径是存在的。

给build_android.sh增加可执行权限:

[plain] view
plain copy

$chmod+x build_android.sh

执行build_android.sh

[plain] view
plain copy

$./build_android.sh

配置该脚本完成对ffmpeg的配置,会生成config.h等配置文件,后面的编译会用到。如果未经过配置直接进行编译会提示无法找到config.h文件等错误。

[plain] view
plain copy

$make

$make install

至此,会在/home/dennis/ffmpeg-2.2目录下生成一个android目录,其中/home/dennis/ffmpeg-2.2/android/arm/lib目录下的so库文件如下:

[plain] view
plain copy

-rwxr-xr-x 1 dennisdennis 55208 Mar 29 16:26libavdevice-55.so

-rwxr-xr-x 1 dennisdennis 632476 Mar 29 16:26 libavfilter-4.so

-rwxr-xr-x 1 dennisdennis 1442948 Mar 29 16:26 libavformat-55.so

-rwxr-xr-x 1 dennisdennis 7985396 Mar 29 16:26 libavcodec-55.so

-rwxr-xr-x 1 dennisdennis 83356 Mar 29 16:26libswresample-0.so

-rwxr-xr-x 1 dennisdennis 308636 Mar 29 16:26 libswscale-2.so

-rwxr-xr-x 1 dennisdennis 300580 Mar 29 16:26libavutil-52.so

注:以上列表去掉了符号链接文件和pkgconfig目录。

第三步:创建一个普通的Android工程

创建一个新的Android工程FFmpeg4Android
在工程根目录下创建jni文件夹
在jni下创建prebuilt目录,然后:

(1) 将上面编译成功的7个so文件放入到该目录下;

(2) 将/home/dennis/ffmpeg-2.2/android/arm/include下的所有头文件夹拷贝到该目录下.

创建包含native方法的类,先在src下创建cn.dennishucd包,然后创建FFmpegNative.java类文件。主要包括加载so库文件和一个native测试方法两部分,其内容如下:

[java] view
plain copy

package cn.dennishucd;

public class FFmpegNative {

static{

System.loadLibrary("avutil-52");

System.loadLibrary("avcodec-55");

System.loadLibrary("swresample-0");

System.loadLibrary("avformat-55");

System.loadLibrary("swscale-2");

System.loadLibrary("avfilter-3");

System.loadLibrary("ffmpeg_codec");

}

publicnative int avcodec_find_decoder(int codecID);

}

用javah创建.头文件:

进入bin/classes目录,执行:javah-jni cn.dennishucd.FFmpegNative

会在当前目录产生cn_dennishucd_FFmpegNative.h的C头文件;

根据头文件名,建立相同名字才C源文件cn_dennishucd_FFmpegNative.c

在这个源文件中实现头文件中定义的方法,核心部分代码如下:

[plain] view
plain copy

JNIEXPORT jint JNICALLJava_cn_dennishucd_FFmpegNative_avcodec_1find_1decoder

(JNIEnv *env, jobject obj, jint codecID)

{

AVCodec*codec = NULL;

/*register all formats and codecs */

av_register_all();

codec= avcodec_find_decoder(codecID);

if(codec != NULL)

{

return0;

}

else

{

return-1;

}

}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

编写Android.mk,内容如下:

[plain] view
plain copy

LOCAL_PATH := $(callmy-dir)

include $(CLEAR_VARS)

LOCAL_MODULE :=avcodec-55-prebuilt

LOCAL_SRC_FILES :=prebuilt/libavcodec-55.so

include$(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE :=avdevice-55-prebuilt

LOCAL_SRC_FILES :=prebuilt/libavdevice-55.so

include$(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE :=avfilter-4-prebuilt

LOCAL_SRC_FILES :=prebuilt/libavfilter-4.so

include$(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE :=avformat-55-prebuilt

LOCAL_SRC_FILES :=prebuilt/libavformat-55.so

include$(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := avutil-52-prebuilt

LOCAL_SRC_FILES :=prebuilt/libavutil-52.so

include$(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := avswresample-0-prebuilt

LOCAL_SRC_FILES :=prebuilt/libswresample-0.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := swscale-2-prebuilt

LOCAL_SRC_FILES :=prebuilt/libswscale-2.so

include$(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE :=ffmpeg_codec

LOCAL_SRC_FILES :=cn_dennishucd_FFmpegNative.c

LOCAL_LDLIBS := -llog-ljnigraphics -lz -landroid

LOCAL_SHARED_LIBRARIES:= avcodec-55-prebuilt avdevice-55-prebuilt avfilter-4-prebuiltavformat-55-prebuilt avutil-52-prebuilt

include$(BUILD_SHARED_LIBRARY)

编写Application.mk[可省略]
编译so文件

打开cmd命令行,进入FFmpeg4Android\jni目录下,执行如下命令:

[plain] view
plain copy

$ndk-build

截止本步骤完成,将在FFmpeg4Android根目录下生成libs\armeabi目录,该目录除了包含上面的7个so之外,另外还生成了libffmpeg_codec.so文件。

添加库的加载方法

在FFmpegNative类中增加如下加载so库的代码:

[plain] view
plain copy

static {

System.loadLibrary("avutil-52");

System.loadLibrary("avcodec-55");

System.loadLibrary("swresample-0");

System.loadLibrary("avformat-55");

System.loadLibrary("swscale-2");

System.loadLibrary("avfilter-3");

System.loadLibrary("avdevice-55");

System.loadLibrary("ffmpeg_codec");

}

修改layout/main.xml,给TextView增加id,以便在代码中操作它。

[html] view
plain copy

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<TextView

android:id="@+id/textview_hello"

android:text="@string/hello"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

/>

</LinearLayout>

增加一个Activity实现类FFmpeg4AndroidActivity,在OnCreate方法中调用native函数将值传给TextView控件,打包运行即可。FFmpeg4AndroidActivity代码如下:

[plain] view
plain copy

package cn.dennishucd;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class FFmpeg4AndroidActivity extends Activity {

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextViewtv = (TextView)this.findViewById(R.id.textview_hello);

FFmpegNativeffmpeg = new FFmpegNative();

intcodecID = 28; //28 is the H264 Codec ID

intres = ffmpeg.avcodec_find_decoder(codecID);

if(res ==0) {

tv.setText("Success!");

}

else{

tv.setText("Failed!");

}

}

}

代码中的28是H264的编解码ID,可以在ffmpeg的源代码中找到,它是枚举类型定义的。在C语言中,可以换算为整型值。这里测试能否找到H264编解码,如果能找到,说明调用ffmpeg的库函数是成功的,这也表明我们编译的so文件是基本可用。

作者注:

[1] 本文编译的方法主要参考了参考资料 [1] 中的思路,这里要感谢作者的贡献;

[2] 后面的测试过程是参考了ffmpeg-2.1.4中的decoding_encoding.c例子;

[3] 关于如何使用pre-built参考了参考资料 [2] 中的思路;

[4] 这只是移植过程第一步,后面还会进一步分析ffmpeg的接口来调用其编解码库.

[5]Android.mk文件应该还可以优化,这是后面的工作.

[6] 整个过程完成还是耗费了我不少精力,如有转载请注明出处,多谢。本文的完整源代码可以在我的CSDN资源(http://download.csdn.NET/detail/gobitan/7132037)下载,最新版本可跟踪我的github(https://github.com/dennishucd/FFmpeg4Android)。

参考资料:

http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/
http://www.ciaranmccormack.com/creating-a-prebuilt-shared-library-on-android-using-the-ndk/




24


0

上一篇Hello
World之Hibernate版

下一篇Ubuntu
Linux下安装Oracle JDK

相关文章推荐

• 深入浅出
- Android系统移植与平台开发(十一)- Android系统的定制

Android系统移植(三)

Android系统移植(一)

• 深入浅出
- Android系统移植与平台开发(一)

• 如何讲CM
Android移植到你的设备?

Zxing之Android移植篇

Android移植librtmp

Android系统的移植要做的两个工作

FFmpeg的Android平台移植—编译篇

我的Android进阶之旅------>经典的大客推荐(排名不分先后)!!

猜你在找
深度学习基础与TensorFlow实践
【在线峰会】前端开发重点难点技术剖析与创新实践
【在线峰会】一天掌握物联网全栈开发之道
【在线峰会】如何高质高效的进行Android技术开发
机器学习40天精英计划
Python数据挖掘与分析速成班
微信小程序开发实战
JFinal极速开发企业实战
备战2017软考 系统集成项目管理工程师 学习套餐
Python大型网络爬虫项目开发实战(全套)

查看评论

57楼 q7223124 2016-10-11 17:00发表 [回复]


楼主,你好,非常感谢您的分享。 此编译的ffmpeg不能编码h264. 楼主知道如何编译ffmpeg+h264编码的方法么?

56楼 仲夏 2016-08-22 11:53发表 [回复]


linux下编吧,省事

55楼 仲夏 2016-07-26 15:17发表 [回复]


你好,我碰到如下问题:

C:\Users\PC\AndroidStudioProjects\ToKnowStudentForAndroid\FFmpeg4Android\app\src\jni>ndk-build

Android NDK: ERROR:C:/Users/PC/AndroidStudioProjects/ToKnowStudentForAndroid/FFmpeg4Android/app/src/jni/Android.mk:avswresample-2-prebuilt: LOCAL_SRC_FILES points to a missing file

Android NDK: Check that /prebuilt/libswresample-2.so exists or that its path is correct

C:/Users/PC/AppData/Local/Android/sdk/ndk-bundle/build//../build/core/prebuilt-library.mk:45: *** Android NDK: Aborting

不知什么原因?

Re: 叔叵谩 2016-08-19 21:43发表 [回复]


回复仲夏:编译成功了吗?我现在也遇到我问题了,就是最后运行时显示“Failed”

Re: gobitan 2016-07-28 22:55发表 [回复]


回复仲夏:建议在ubuntu环境下编译,可以用VMPlayer虚拟机

54楼 仲夏 2016-07-26 09:01发表 [回复]


楼主,ffemg是windows环境的还是linux环境的?

Re: gobitan 2016-07-28 22:54发表 [回复]


回复仲夏:linux环境

53楼 gobitan 2016-05-13 15:39发表 [回复]


是的,你也可以解压到任何位置,然后在脚本中将路径替换为你的就可以了

52楼 [游客] 2016-05-12 09:36发表 [回复]


大神,我的NDK是要解压到什么位置怎么没写啊?是解压到Linux下引用,还是解压到Windows下引用????

急急急~~~~~~~~~~~

51楼 [游客] 2016-05-12 09:32发表 [回复]


楼主的大神啊!

请教个问题,你的脚本这么写的:NDK=/home/dennis/android-ndk-r9d ,意思是NDK解压在Linux环境下这个/home/dennis/包中吗?

50楼 zhaobingg 2016-04-14 15:14发表 [回复]


好了,因为android.mk文件中的多余空格和缺少空格导致的

建议大家参考的时候,下载作者源码:https://github.com/dennishucd/FFmpeg4Android)

参考这个里面文件

49楼 zhaobingg 2016-04-14 09:17发表 [回复]


楼主,我成功编译出7个so

后按你步骤创建项目

在使用ndk-build编译jni调用的so时出现下面的问题,楼主帮忙看看

E:\project\FFmpeg4Android\jni>ndk-build

Android NDK: ERROR:E:/project/FFmpeg4Android//jni/Android.mk:avswresample-2-prebuilt: LOCAL_SRC_FILES points to a missing file

Android NDK: Check that /prebuilt/libswresample-2.so exists or that its path is correct

D:/Android/ndk/android-ndk-r9d/build/core/prebuilt-library.mk:45: *** Android NDK: Aborting . Stop.

48楼 sxy_sdy 2016-04-06 16:47发表 [回复]


在请教一下,我编写了一个测试用的apk,在android 5.1上可以正常的运行,在android 4.2上,只能解码一帧,第二帧就崩溃了,是解码同一个文件,运行同一个程序。我编译的时候,环境变量指定的是:100 export NDK=/work/android-ndk-r10b

101 export PATH=$PATH:$NDK

102 export SYSROOT=$NDK/platforms/android-9/arch-arm

103 export TOOLCHAIN=/work/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x

86

104 PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86

105 SYSROOT=$NDK/platforms/android-17/arch-arm

106 CC=$PREBUILT/bin/arm-linux-androideabi-gcc

107 LD=$PREBUILT/bin/arm-linux-androideabi-ld

108 AS=$PREBUILT/bin/arm-linux-androideabi-gcc

109 AR=$PREBUILT/bin/arm-linux-androideabi-ar

110 RANLIB=$PREBUILT/bin/arm-linux-androideabi-ranlib

111 STRIP=$PREBUILT/bin/arm-linux-androideabi-strip。 请问一下,如何排查这种错误?

Re: sxy_sdy 2016-04-06 16:53发表 [回复]


[reply]sxy_sdy[/reply已经定位到时调用av_packet_get_side_data导致的。在调用 for (i = 0; i < pkt->side_data_elems; i++)的时候,崩溃的。同样的数据,为什么会有不同的结果?

Re: sxy_sdy 2016-04-07 11:44发表 [回复]


回复sxy_sdy:已经解决了,是由于解码的时候,没有调用av_init_packet(&avpkt);导致的。

47楼 sxy_sdy 2016-03-28 20:17发表 [回复]


楼主,你好。我目前按照你的步骤来编译ffmpeg,可以成功编译出so文件,但是编写自己的JNI接口的时候,在连接的时候报错,提示:/work/android-ndk-r10b/toolchains/x86-4.6/prebuilt/linux-x86/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: error: /work/ffmpegjni/obj/local/x86/libavcodec-56.so:
incompatible target 。使用file命令查看,结果如下:root@ubuntu:/work/ffmpegjni/jni/libffmpeg/lib# file libavcodec-56.so

libavcodec-56.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), stripped。请问一下是什么原因导致的?

Re: gobitan 2016-03-29 09:55发表 [回复]


回复sxy_sdy:你用的手机硬件平台是不是ARM, EABI?如果要适配多平台,需要在编译的Application.mk中指定,比如x86,arm7等,总共好像有四五个

Re: sxy_sdy 2016-03-29 10:49发表 [回复]


回复gobitan:多谢楼主,去掉Application.mk这个文件就好了。没有研究过这个文件是什么作用的。

Re: gobitan 2016-04-01 23:23发表 [回复]


回复sxy_sdy:这个文件的作用就是指定编译的平台

46楼 今世进士尽是近视 2016-03-13 00:08发表 [回复]


ubuntu@ubuntu:~/ffmpeg-3.0$ ./config.sh

/home/ubuntu/eclipse/android-ndk-r10e/toolchains/mipsel-linux-android-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.

C compiler test failed.

这是我的ndk及路径

export NDK=/home/ubuntu/eclipse/android-ndk-r10e

export PREBUILT=$NDK/toolchains/mipsel-linux-android-4.8/prebuilt

export PLATFORM=$NDK/platforms/android-8/arch-arm

export PREFIX=../simplefflib

这个错大家肯定遇到过,请问是怎么绝决的

Re: gobitan 2016-03-24 22:35发表 [回复]


回复今世进士尽是近视:这个错是你的gcc的路径不对,一定要将文中的NDK,SYSROOT,TOOLCHAIN等几个环境变量设置对,要指向你的ndk路径

45楼 澈澈丶 2016-01-14 18:27发表 [回复]


Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVersi

on 8 in D:/Yixin/workspace/android/FFmpeg4Android/AndroidManifest.xml

Android NDK: ERROR:D:/Yixin/workspace/android/FFmpeg4Android/jni/Android.mk:swre

sample: LOCAL_SRC_FILES points to a missing file

Android NDK: Check that /prebuilt/libswresample-1.so exists or that its path is

correct

D:/develop/Android/android-ndk-r10e/build/core/prebuilt-library.mk:45: *** Androd ndk :Aborting .stop楼主这是什么情况

Re: gobitan 2016-01-14 21:42发表 [回复]


回复澈澈丶:你是自己参考文章后写的还是直接运行的我文中最后提到的已经编译好的工程,建议用后者,剩余很多不必要的错误,因为代码或者脚本贴出来之后,有些格式或者空格没有了就会导致错误

Re: 澈澈丶 2016-01-17 00:43发表 [回复]


回复gobitan:我是在自己在linux自己编译的 然后拿出来自己写测试工程编译的时候出错的

44楼 黄志传 2016-01-08 12:02发表 [回复]


感谢楼主,我用ndkr10e编译ffmpeg2.2,用低版本手机运行时会出现加载so失败,用5.1的手机运行就可以,跟大家分享一下。我的编译脚本如下:

export NDK=/usr/lib/ndk/android-ndk-r10e

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt

export PLATFORM=$NDK/platforms/android-9/arch-arm

export PREFIX=../simplefflib

build_one(){

./configure --target-os=linux --prefix=$PREFIX \

--enable-cross-compile \

--enable-runtime-cpudetect \

--disable-asm \

--arch=arm \

--cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \

--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \

--disable-stripping \

--nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \

--sysroot=$PLATFORM \

--enable-gpl --enable-shared --disable-static --enable-small \

--disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \

--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"

}

build_one

Re: 黄志传 2016-01-08 12:04发表 [回复]


回复黄志传:如果出现加载so失败的问题可以检查一下版本兼容性问题

43楼 fly_ever 2015-12-18 11:34发表 [回复]


执行到第九步时,只能生成libs/armeabi/libswresample-1.so

,可能有哪些原因呢?

42楼 我是丑男我怕谁 2015-11-02 10:54发表 [回复]


不知道是否可以加下楼主QQ讨论下, 我的扣扣是 757177823

41楼 那块代码没问题 2015-10-08 17:02发表 [回复]


我也是了好多次才通过了,应该是版本的问题

40楼 赫贺鹤 2015-09-06 15:48发表 [回复]


怎么样才能只生成libffmpeg.so一个so文件呢

39楼 aaadqiang 2015-08-21 13:01发表 [回复]


楼主你好,当我执行build_androi.sh的时候报了这个错,就没有再往下走了,android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc is unable to create an executable file.

C compiler test failed.,请问这是为什么啊?

38楼 弛简 2015-08-07 10:20发表 [回复]


有个问题啊,源码中应该有九个库才对啊,为什么编译出来只有七个?另外两个合并在一起了么?

37楼 血色天坑 2015-07-28 13:39发表 [回复]


楼主您好,我执行ndk-build的时候其前7个so库都成功Prebuilt并Install了,但是最后一个ffmpeg_codec显示到SharedLibrary: libffmpeg_codec.so后就报错FFmpegNative.c:26: error: undefinde reference to 'avcodec_find_decoder然后就无法在libs下生成这个so库

36楼 somebody0101 2015-07-18 20:42发表 [回复]


你好楼主,此问题困扰了很久。其中一步是build_android.sh

我那三个参数都按照自己电脑设定的,但是每次执行./build_android.sh都会报错,很多configure下的所有命令都是command not found,prefix也提示not such file or dictionay

这怎么回事?谢谢

Re: jingqiu119 2015-11-30 14:42发表 [回复]


回复somebody0101:你的脚本格式是dos,要改成unix格式。

35楼 cch20094685 2015-07-08 16:16发表 [回复]


楼主 你好

我按照你的博客编译了一下,但是每个so都含有两种一种是带有数字,另外一种是没带数字,在测试的时候遇到问题:

undefined reference to 'av_register_all()'undefined reference to 'avcodec_find_decoder(AVCodecID)'这是怎么回事呢

Re: 弛简 2015-08-07 10:23发表 [回复]


回复cch20094685:其中有一个是链接文件,不是真正的.so库

34楼 786535946 2015-06-30 11:57发表 [回复]


你好,第三步:创建一个普通的Android工程 中的操作都是在windows环境下操作的吧?

Re: gobitan 2015-07-06 17:25发表 [回复]


回复786535946:创建Android工程windows和linux都可以,这个不影响

33楼 canghaiyuchen 2015-06-25 23:23发表 [回复]


mark~感谢楼主,mac 上编译成功,明天继续新建android工程测试~

32楼 擎正义之旗 2015-06-10 11:42发表 [回复]


楼主好,文章写的很清晰!

想请教一下,我在1cmd命令行使用ndk-build的时候提示错误:android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -landroid

collect2.exe: error: ld returned 1 exit status

make.exe: *** ffmpeg_lib/obj/local/armeabi-v7a/libffmpeg

util.so] Error

这个是为什么提示缺少landroid库呢?还是说需要用cygwin来ndk-build?

Re: huangbin123 2015-10-24 18:10发表 [回复]


回复擎正义之旗:下载他的项目把application.mk文件加进去才就可以,亲测。

Re: gobitan 2015-06-11 15:52发表 [回复]


回复擎正义之旗:必须要在linux下编译,文章开头有编译环境说明

Re: 786535946 2015-07-01 15:50发表 [回复]


回复gobitan:这样回复才会被看到么

31楼 no-money 2015-06-03 18:13发表 [回复]


刚接触ffmpeg,按照博主你的步骤进行编译,但是最后生成的文件都是.a后缀的,我前面的编译步骤都是按照你的要求来的,不知道问题出在那?看到留言的话,希望能给与小白解答。。感激!

Re: gobitan 2015-07-06 17:26发表 [回复]


回复no-money:仔细对比环境,步骤是否与我写的都完全一致

30楼 sunrise2015 2015-04-26 16:32发表 [回复]


谢谢楼主,我还有个问题,我编译完成后生成了libswscale-2.so和libswscale.so,请问,这2个文件啥区别,为什么你要用带数字的so文件,不用不带的呢?我把库换成不带数字的so文件,同时修改了2个地方,loadLib的地方和mk文件,出来的apk运行异常。SLIB_INSTALL_NAME和SLIB_INSTALL_NAME有啥区别?

Re: sunrise2015 2015-04-26 16:37发表 [回复]


回复sunrise2015:写错了,是SLIB_INSTALL_NAME和SLIB_INSTALL_LINKS有啥区别?

29楼 ssl999sss 2015-04-24 19:48发表 [回复]


楼主你好 我按你的方式 编2.2.4和2.6.2都没有通过

/opt/work/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.

C compiler test failed.

If you think configure made a mistake, make sure you are using the latest

version from Git. If the latest version fails, report the problem to the

ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.

Include the log file "config.log" produced by configure as this will help

solving the problem.

另外,我想知道的是 你怎么在Android下把H264的流送进去解出 图片出来,之前用网上的SO因为版本太旧解流常出错. 万分感激!

Re: 今世进士尽是近视 2016-03-13 00:13发表 [回复]


回复ssl999sss:你这个错你解决了吗,我也出现这个错

这是我的ndk配置

export NDK=/home/ubuntu/eclipse/android-ndk-r10e

export PREBUILT=$NDK/toolchains/mipsel-linux-android-4.8/prebuilt

export PLATFORM=$NDK/platforms/android-8/arch-arm

export PREFIX=../simplefflib

Re: ssl999sss 2015-04-24 19:59发表 [回复]


我在 http://download.csdn.net/download/wain163/7494547 下载到 so文件 他也是按楼主方式生成的.只是不知道这些 哪个是解码 H264的,还是都要用上 之前用的ffmpeg.so :

Init(int width, int height);

DecoderNal(byte[] in, int insize, byte[] out);

解析流 对H264一无所知 还请给予指点

28楼 sunrise2015 2015-04-22 22:35发表 [回复]


楼主,你好!我想问个问题,我只想用ffmpeg下面的缩放库,其他库不用,如果按照build_android.sh来写,make之后生成的libswscale-2.so能直接放在安卓平台下用吗?这个so文件是安卓平台下可用的so文件吗?

Re: gobitan 2015-04-23 14:23发表 [回复]


回复sunrise2015:是可以的

27楼 Yao-debo 2015-03-30 19:50发表 [回复]


GOOD

26楼 bushboshi 2015-03-23 14:46发表 [回复]


你好,我按照你的教程顺利打出7个so文件了,但是在放入安卓工程运行以后,他返回这个:

dlopen failed: cannot locate symbol "atof" referenced by "libavformat-56.so"...

然后就报错了,我不知道哪里有错误,编译的时候也没报错。

我的ndk version:10b;

ffmpeg version:2.6.1;

25楼 Jonesx 2015-03-13 20:16发表 [回复]


博主,你好,我按照你的方法编译好了,Android程序例子也运行成功了,问题在于如果调用av_open_input_file()等函数,就会出现error: undefined reference to 'av_open_input_file';这个应该怎么解决呢??

Re: tiger_bear 2015-03-19 18:23发表 [回复]


回复Jonesx:这是因为你LOCAL_SHARED_LIBRARIES共享库没设置好,在编译时没找到av_register_all(),LOCAL_SHARED_LIBRARIES:= avcodec-56-prebuilt avdevice-56-prebuilt avfilter-5-prebuilt avformat-56-prebuilt avutil-54-prebuilt这样就好

24楼 datanglang1 2015-01-26 22:49发表 [回复]


楼主,我用的是NDK10,ffmepg2.5.3,按照你的方法写了build_android.sh,但是执行./build_android的时候通不过,是什么原因?

Re: 飞默 2015-03-08 19:32发表 [回复]


/home/hcy/dennis/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc is unable to create an executable file.

C compiler test failed.

你好,我确实在cross-prefix 这边出问题了,我的路径下面找的到这个文件,能看下是什么问题?

23楼 JulyLiuY 2015-01-16 16:54发表 [回复]


请问第六步的.c文件是放在哪里的?

还有就是第六步九步 ndk-build的时候

error: unknown type name 'JNIEXPORT'

error: expected '=', ',', ';', 'asm'or'__attribute__'before'JNICALL'

error: unknown type name 'JNICALL'

make: *** [/workspace/FFmpeg4Android/obj/local/armeabi/objs/ffmpeg_code/cn_dennishucd_FFmpegNative.o] Error 1

请问楼主这些都有可能是什么原因导致的?

Re: gobitan 2015-01-17 21:12发表 [回复]


回复JulyLiuY:具体位置参见文章末尾附带的工程下载地址,可以下载完整的整个工程,该工程可以编译通过并运行。

22楼 mikelvox 2015-01-08 16:33发表 [回复]


好文章,编译运行都没有错误。

不过我是奇怪avcodec_find_decoder怎么和Java_com_example_huawei_FFmpegNative_avcodec_1find_1decoder有对应关系的?

21楼 嵌入式linux_走起 2015-01-08 15:47发表 [回复]


编译通过但是运行时报如下错误 ,求助

java.lang.UnsatisfiedLinkError: Native method not found: com.yybnative.FFmpegNative.avcodec_find_decoder:(I)I

20楼 keke274233971 2015-01-06 17:47发表 [回复]


hi,楼主,cn_dennishucd_FFmpegNative.c改为cn_dennishucd_FFmpegNative.cpp,Android.mk也改了,但是ndk-build报错FFmpeg4Android/jni/libavutil/common.h:30:2: error: #error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS,是不是不能用cpp啊

19楼 fzbdeqq123 2014-12-26 09:29发表 [回复]



引用“Peter_Hugh”的评论:我编译成功了,但是在运行的时候会出现这个错误 cannot locate 'log2f...

18楼 精分患者 2014-12-23 17:54发表 [回复]


我编译成功了,但是在运行的时候会出现这个错误 cannot locate 'log2f',请问你知道怎么回事吗?

Re: fzbdeqq123 2014-12-26 09:27发表 [回复]


回复精分患者:问题解决了么,我也是报的那个错误。换一个版本试一下

Re: 精分患者 2014-12-26 11:28发表 [回复]


回复fzbdeqq123:解决了,换成低版本android编译就没事了

Re: 精分患者 2014-12-26 11:27发表 [回复]


回复fzbdeqq123:解决了,因为我编译用的android版本要比测试用机器的版本高,然后换成低版本就没事了

Re: fzbdeqq123 2014-12-27 18:18发表 [回复]


回复精分患者:我的是android4.4 NDK r10 你用的什么版本的 ,开始我用的FFmpeg是2.5 后面改成了2.1也是报哪个错。

Re: 精分患者 2014-12-28 13:19发表 [回复]


回复fzbdeqq123:我开始用的是android4.4+r10d+ffmpeg2.5,后来换成android4.1.2+r10d+ffmpeg2.5,关键就是你用的android版本要比你测试用的机器的android版本要低一些

Re: 精分患者 2014-12-28 13:09发表 [回复]


回复fzbdeqq123:我开始用的是android4.4+r10d+ffmpeg2.5,后来换成android4.1.2+r10d+ffmpeg2.5,关键就是你用的android版本要比你测试用的机器的android版本要低一些

17楼 lhw_1991 2014-12-22 15:42发表 [回复]


非常感谢您的文章!

如果要实现将多张图片合成视频的功能,应该就再通过JNI调用FFmpeg的相关方法就可以了吧?但网上的其他资料都是用命令行的,不知道您有没有研究到其他方法。

16楼 一缕 2014-12-15 12:25发表 [回复]


楼主你好,我按照你的方法编译出来.so,但是我在android工程里面用一个简单的hello-jni去加载这些动态库的时候出错,我用adb 到手机去看/data/....,也找到了这些库,可为何老是提示加载不到呢?

Re: gobitan 2014-12-18 14:17发表 [回复]


回复一缕:估计说工程配置或者makefile没写对,你可以试试我文中给出的链接工程,下载下来对比下

Re: 一缕 2014-12-18 18:04发表 [回复]


回复gobitan:不是makefile问题!是版本太高,手机不支持,我换成ffmpeg2.1就好了;android兼容性不好,但是我现在加载X264库进去,调用x264里面的 avcodec_open2这个函数,应用就启动不了,但是运行没有输出异常信息! 感觉好郁闷的

15楼 KDF5000 2014-12-07 16:41发表 [回复]


楼主,按照你的教程前面都很顺利,但是到ndk-build JNI(第9步)的时候出现下面的错误:

arm-linux-androideabi/bin/ld: cannot find -llog-ljnigraphics

请问楼主遇到过吗?

Re: wbrook 2015-04-09 09:30发表 [回复]


回复KDF5000:-llog-ljnigraphics之间少空格

Re: wbrook 2015-04-09 09:31发表 [回复]


回复KDF5000:-llog-ljnigraphics之间少空格

Re: gobitan 2014-12-12 17:55发表 [回复]


回复KDF5000:没遇到,可能是版本的问题,如操作系统版本,ndk版本等不同造成的

14楼 KDF5000 2014-12-07 16:41发表 [回复]


楼主,按照你的教程前面都很顺利,但是到ndk-build JNI(第9步)的时候出现下面的错误:

arm-linux-androideabi/bin/ld: cannot find -llog-ljnigraphics

请问楼主遇到过吗?

Re: tiger_bear 2015-03-19 16:53发表 [回复]


回复KDF5000:改成这样就行了LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid,只是少了个空格,所以找不到jnigraphics库

Re: KDF5000 2015-06-05 09:38发表 [回复]


回复tiger_bear:已经好了,谢谢!

13楼 keke274233971 2014-12-01 09:52发表 [回复]


你好楼主,为什么我把.so放到eclipse加载,部分(libavdevice-55.so,libavutil-52.so)加载会失败

Re: gobitan 2014-12-02 10:43发表 [回复]


回复keke274233971:加载失败的原因可能有很多,比如路径不对,名字拼写错误等都可能造成加载失败。如果你自己的工程弄不成功,建议直接下载文章最后给的链接,那个是可以编译通过并运行的。

Re: keke274233971 2014-12-11 17:13发表 [回复]


回复gobitan:多谢楼主啊!虽然按照你说的可能编译,但是还是没有通过。最后发现了是ndk的版本太高了,我用的是r10的,你用的是r9d的。我改用低版本r9d结果编译过了,对此无语。但是非常感谢楼主

12楼 tanmengwen 2014-10-24 17:48发表 [回复]


好文章!!!

11楼 liuhao 2014-10-04 17:17发表 [回复]


(Ndk路径)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.

C compiler test failed.

If you think configure made a mistake, make sure you are using the latest

version from Git. If the latest version fails, report the problem to the

ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.

Include the log file "config.log" produced by configure as this will help

solving the problem.

请问lz根据贴中的sh脚本进行ffmpeg配置时提示上述信息,是什么原因。

Re: powar2 2014-12-05 19:17发表 [回复]


回复liuhao:也困扰了我很久,我是这么解决的在build_android.sh 里加入export TMPDIR=路径自己定就可以了 还有主要检查路径:有一个路径错误新手可能会犯(我就这样错了),home下的文件夹路径中间其实还有个用户名存在,你点开文件仔细看路径就清楚了

Re: 飞默 2015-03-08 19:47发表 [回复]


回复powar2:哥们,你处理好了吗,我也没处理好

Re: a376371617 2015-01-10 20:51发表 [回复]


回复powar2:#!/bin/bash

NDK=/home/yinjialiang/app/android-ndk-r9d

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

export TMPDIR=/home/yinjialiang/soft/ffmpeg-2.5.2/tmp

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" \

--extra-libs=-lgcc

$ADDITIONAL_CONFIGURE_FLAG

}

CPU=arm

ADDI_CFLAGS="-marm"

build_one

临时文件是有指定的,但执行脚本还是会提示arm-linux-androideabi-gcc is unable to create an executable file. 查看了config.log的内容,发现其实是这个原因arm-linux-androideabi-gcc: cannot execute binary file 但我的目录给的权限都是777。楼主,有遇到过类似问题吗?

Re: 今世进士尽是近视 2016-03-13 00:15发表 [回复]


回复a376371617:我也出现这个错,零时文件我指定了,还是报这个错我是在ubuntu下报的

这是我的ndk配置

export NDK=/home/ubuntu/eclipse/android-ndk-r10e

export PREBUILT=$NDK/toolchains/mipsel-linux-android-4.8/prebuilt

export PLATFORM=$NDK/platforms/android-8/arch-arm

export PREFIX=../simplefflib

Re: 飞默 2015-03-08 19:47发表 [回复]


回复a376371617:你找到处理的办法了吗?

Re: xm447975373 2015-03-25 16:56发表 [回复]


回复飞默:这个问题解决了吗?我也碰到这个问题了!

Re: boblue 2015-06-18 14:49发表 [回复]


回复xm447975373:兄弟,这个问题有解决吗?困扰我一个星期了

Re: huangbin123 2015-10-20 16:47发表 [回复]


回复boblue:第二行请加上

export TEMPDIR="D:/jni"

执行前dos2unix

Re: 拓荒牛 2014-11-21 17:09发表 [回复]


回复liuhao:我也出现了你的错误,兄弟你解决了没,是怎么解决的?

10楼 rosenmao 2014-08-22 11:55发表 [回复]


我是在Windows7+NDK+Cygwin下执行

$ ./build_android.sh

Unknown option "sourses/ffmpeg-2.3.3/android/arm".

See ./configure --help for available options.

这个错误怎么解啊???

9楼 magaman 2014-08-03 22:32发表 [回复]


請問ffmpeg.avcodec_find_decoder傳回0之後,要怎麼繼續使用FFmpeg的功能(例如視頻剪輯、串接、轉檔)?

Re: owen6169496 2014-11-27 11:03发表 [回复]


回复magaman:回复u012781753:我也出现了和你一样的问题,“ffmpeg.avcodec_find_decoder傳回0”

Re: 叔叵谩 2016-08-19 21:40发表 [回复]


回复owen6169496:传回0是正确的啊,我的为什么传回-1

Re: owen6169496 2014-11-27 11:02发表 [回复]


回复magaman:我也出现了和你一样的问题,“ffmpeg.avcodec_find_decoder傳回0”

8楼 yyl7886908 2014-07-18 10:55发表 [回复]


楼主你好,我按照你的方法执行完make之后,没有在ffmpeg源代码下生成android 目录,但是后面的几个so库在其他目录生成了。我从github上下载下你的工程后,按照你的方法再编译一边,还是没有生成android目录。请问你遇到这问题吗?我总感觉是我的ndk出了问题。 我在执行./build_android.sh的时候出现了下面的警告。WARNING: /home/yyl/javatool/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config
not found, library detection may fail.

Re: yyl7886908 2014-07-18 13:35发表 [回复]


回复yyl7886908:已经解决,没有执行make install

Re: jingqiu119 2015-11-30 15:22发表 [回复]


回复yyl7886908:你是先make install还是make啊?

7楼 bobantangzlt 2014-07-08 10:47发表 [回复]


最后还是弄出来了,谢谢楼主的好文章!!!还发现了一个错误就是加载so库的代码里面的System.loadLibrary("avfilter-3");应该是System.loadLibrary("avfilter-4");~~~

6楼 bobantangzlt 2014-07-07 19:57发表 [回复]


还有就是我下载了你的FFmpeg4Android工程在android2.2中运行时会有java.lang.ExceptionInInitializerError错误,不知道是什么原因?

5楼 bobantangzlt 2014-07-07 17:09发表 [回复]


楼主,你好!执行这句命令$ndk-build ,是不是要先在windouws下面安装NDK呀?

Re: gobitan 2014-07-08 23:09发表 [回复]


回复bobantangzlt:是的,必须的哈

4楼 金良山庄 2014-06-12 21:15发表 [回复]


我用楼主的文件在32位的Ubuntu12.04上编译会失败,不知道为什么。然后我在64位系统上编译,也出错,提示有文件找不到。然后我从官网上下载ffmpeg2.2版本,最终编译成功。有遇到这种情况的吗?楼主觉得是什么原因。

3楼 xiaotian0627 2014-06-03 18:03发表 [回复]


LOCAL_SRC_FILES :=prebuilt/libavcodec-55.so

ndk-build的时,报找不到文件错误,楼主遇到过么

谢谢

Re: gobitan 2014-06-03 22:06发表 [回复]


回复xiaotian0627:执行ndk-build之前请确保已经在ubuntu下把这几个so文件编译好并放入prebuilt目录了

Re: bobantangzlt 2014-07-08 09:24发表 [回复]


回复gobitan:原来是因为Android.mk中的第一行”LOCAL_PATH := $(callmy-dir) ”的call后面没有空格~~~

Re: 血色天坑 2015-07-26 22:02发表 [回复]


回复bobantangzlt:我执行ndk-build后显示: Error 1 make.exe:*** Deleting file'F:/Rong/MyProject/MyDecode/app/src/main//libs/armeabi/libavcodec-55.so'然后就没有在libs中成功生成so库,请问是什么原因啊?

Re: 蔷薇-_- 2015-06-04 21:57发表 [回复]


回复bobantangzlt:非常感谢,帮助很大。之前一直找不到原因!

2楼 xgdtale1097356083 2014-05-30 11:47发表 [回复]


楼主,你好,非常感谢您的分享,按上面的步骤我成功编译出了so文件。请问ffmpeg编译成功后,具体怎么执行ffmpeg的命令,我现在需求是:读取mp4的视频帧 ,能不能指点下。谢谢

Re: gobitan 2014-06-03 17:58发表 [回复]


回复xgdtale1097356083:要读取,播放并解码mp4文件,需要结合SDL来完成,具体过程较为复杂,我看后面是否有时间再写相关的文章

1楼 testing2007 2014-05-20 09:42发表 [回复] [引用] [举报]


谢谢你的文章,对我有帮助,直接拷贝你build_android.sh文件的内容,需要注意的每个\后面的空格,否则编译的时候会出现解析错误,编译的时候很快会被刷屏,需要control+c看一下是否有错误。没有就按照写好的文件进行执行。

Re: 嵌入式linux_走起 2015-01-08 10:25发表 [回复] [引用] [举报]


回复testing2007: 是啊,我也遇到这个问题,谢谢提醒。

Re: gobitan 2014-05-26 10:12发表 [回复]


回复testing2007:能对你有帮助我感到很高兴。有博友也跟我反应了这个问题,这是我在本地写好后拷贝过去,CSDN的编辑系统给我搞丢了。大家可以在我文中提到的CSDN资源或者github上直接去下载完整的源代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: