使用Android NDK r5b编译FFmpeg

7

使用android ndk r5b编译ffmpeg。

ffmpeg版本为0.6.1。

使用的工具为android ndk r5b和cygwin 1.7。

构建参考链接:http://www.cnblogs.com/scottwong/archive/2010/12/17/1909455.html

但是,执行ffmpeg的./configure命令时出现错误!(config.err文件如下)

check_cc
BEGIN /tmp/ffconf.GlDiY1P8.c
    1   int main(void){ return 0; }
END /tmp/ffconf.GlDiY1P8.c
/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/windows/bin/arm-eabi-gcc -fPIC -DANDROID -c -o /tmp/ffconf.1kQLpGaU.o /tmp/ffconf.GlDiY1P8.c
arm-eabi-gcc.exe: /tmp/ffconf.GlDiY1P8.c: No such file or directory

arm-eabi-gcc.exe: no input files

C compiler test failed.

所以,我只是在尝试测试代码。

// test.c code
int main(){
  return 0;
}

/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/windows/bin/arm-eabi-gcc -fPIC -DANDROID -c -o ./test.o ./test.c
好的!没问题。
但是,将./test.c复制到/tmp(拷贝到/tmp目录)。
/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/windows/bin/arm-eabi-gcc -fPIC -DANDROID -c -o ./test.o /tmp/test.c
arm-eabi-gcc.exe: /tmp/test.c: No such file or directory
arm-eabi-gcc.exe: no input files

失败了!!!只有文件路径不同。/tmp目录存在,权限也正确。/home/test.c的结果相同。

出了什么问题?


你成功解决了上述问题吗?如果是这样,能否分享一下解决方案? - Swathi EP
6个回答

6

我曾经费了很大力气在Windows中让它工作,但最终我成功了!之前的帖子是正确的——Cygwin路径和Windows路径存在问题。

我尝试了上面帖子中描述的解决方案,但它并没有起作用。最后我明白了原因:即使你在build_android.sh文件中输入了Windows路径,FFmpeg的配置仍然包含错误的路径。

所以在我的情况下,我部分地更改了FFmpeg根目录中的配置文件:

#set temporary file name
: ${TMPDIR:=$TEMPDIR} 
: ${TMPDIR:=$TMP}
: ${TMPDIR:=/tmp}

转换为:

# set temporary file name
#: ${TMPDIR:=$TEMPDIR}
#: ${TMPDIR:=$TMP}
: ${TMPDIR:=D:/InstallTools/Android/Cygwin_Root/tmp}

之后,我成功将其编译。

FFmpeg中没有配置文件。你是指configure吗? - vikky
我正在执行./build_android.sh,然后它给了我一个"权限被拒绝"的错误信息,我犯了什么错误? - syam vakkalanka

3

您没有设置临时目录。您可以在/etc/profile中设置它,或者只需在终端中使用export TMPDIR=/your/tmp/directory。 注意: 1. 如果您使用cygwin编译,则目录必须类似于D:/tmp。您不能使用/cygdrive/d/tmp。 2. 您必须拥有该文件夹的权限。


1

我也无法使其工作,我遇到了完全相同的问题。但是,我能够使用“android-ndk-r4”进行编译。目前我不确定是什么原因导致的问题,但是如果我找到解决方法,我也会发布出来。

所以现在的解决方法是使用ndk r4。


你在使用ndk-r4时如何提及路径? - Swathi EP

1

我成功地构建了它,使用了NDK R6和cygwin。实际上,它不支持/cydrive/路径,只需使用类似于Windows的路径即可;下面是一个示例:

NDK=e:/AndroidSDK/NDK6
PLATFORM=$NDK/platforms/android-9/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows

1
请问您能分享一下用于构建FFmpeg的config.sh文件吗? - Swathi EP

0
如果您还没有解决这个问题,请检查ffmpeg目录中config.log的最后一部分;很可能是路径或CC参数的问题。

0

我也遇到了与r6完全相同的问题。我尝试了Lambage在r4上的建议,但仍然无法使其工作。

我一直在研究这个问题,我认为我已经发现了原因。

1)configure调用的是android交叉编译器,它是一个windows .exe文件。

2)它通过cygwin调用,cygwin使用unix文件命名约定。例如/cygdrive/c/directory而不是C:\directory

3)在android NDK工具链文档中指出,交叉编译器不接受cygwin风格的文件路径(来源:NDK/docs/STANDALONE_TOOLCHAIN.html):


5.1/ Windows支持:

Windows二进制文件不依赖于Cygwin。好消息是它们更快,坏消息是它们不理解Cygwin路径规范,如/cygdrive/c/foo/bar(而不是C:/foo/bar)。


我仍在努力寻找解决方法。如果我解决了,我会回来编辑这篇文章...待续


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接