bug啊。。。要命啊。。。
两种ndk-build方式
a.libffmpeg什么都不修改,
b. 修改,按我的博文 或者我本次采用的 http://abitno.me.sixxs.org/compile-ffmpeg-android-ndk
(又或者参考baicheng推荐。。將 FFmpeg整合至Android平台) 进行尝试。
本次首先使用第一种方式:
问题1. make: *** empty variable name. Stop (已解决)
原因:原来是ndk路径对空格‘ ‘ 和小数点’ .'均不支持。myelipse8.6 默认workspace 的位置有个/myeclipse 8.6/ 这个路径,要删除!!!
之后即可。但是紧接着报出第二个错误(之前sz机器上并没有这个问题,产生的原因估计跟新机器指令集有关系)
问题2. Compile thumb : avcodec <= 4xm.c(未解决)
/home/grant/Workspaces/ffmpeg/jni/libffmpeg/libavcodec/4xm.c: In function 'decode_frame':
/home/grant/Workspaces/ffmpeg/jni/libffmpeg/libavcodec/x86/mathops.h:93: error: can't find a register in class 'CC_REG' while reloading 'asm'
为什么会出现这个呢?定位到具体位置内容为
#define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
__asm__ ("shrl %1, %0\n\t"
: "+r" (a)
: "ic" ((uint8_t)(-s))
);
return a;
}
难道是不支持 汇编语句 —asm—? 是gcc的问题还是ndk的问题?
原因:
参考文章:1. http://www.diybl.com/course/6_system/linux/Linuxjs/20090309/160214.html
之前因為想找出 ass 字幕爛掉的原因,得編譯一個 debug 版本的 mplayer。但只要一加入這個選項後編譯就會爛掉,會跑出如下的錯誤訊息:
can’t find a register in class ‘GENERAL_REGS’ while reloading ‘asm’
當時也沒仔細去找解法,直接用插入 printf 的方法來觀察一些變數,問題也順利解決了。不過昨天把 svn head 抓下來編譯後也是一樣,看來應該是老問題了,查了一下 maillist 發現有人問過,可以參考這幾封信:
http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2006-November/047222.html
http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2006-November/047221.html
解決方法是在 libavcodec/Makefile 的 CFLAGS 加入 -fomit-frame-pointer 參數就好。編譯完果然變得超級肥大…看起來是可以用 gdb 來跑了:
88M mplayer
6.9M mplayer-strip
這問題好像留了好幾年還找不到解決方法,不過在 FAQ 中是把問題推給 gcc,所以在 gcc 的 ml 上也發現有人問過類似的 問 題….
2. 但是上面的方法也有人不成功:
46 for (i = 0; i < 0x20 / 2; i += 4)
47 {
48 asm(
49 "movaps %2, %%xmm3\n\t"
50 "shufps $27, %%xmm3, %%xmm3\n\t"
51 "movups %3, %%xmm1\n\t"
我查了网上有如下说的:
export CFLAGS=-fomit-frame-pointer
但依然没有解决,Google也不好搜,这个问题难道过于容易了?请大侠指点一下,搞了好久了,无从下手啊。
多谢。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
鉴于错误太多,不得不采用第二种方法。
Android的GCC是不支持restrict关键字的,所以把ffmpeg源码下configure生成的config.h文件中的这一行:
#define restrict restrict 改成 #define restrict /*意思就是把后面的restrict去掉*/
如果重新Configure的话记得要把这个关键字去掉。
完全修改后,
需要