基于Android平台的x264的移植与应用(一):移植篇

来源:互联网 发布:梦幻西游mac 验证失败 编辑:程序博客网 时间:2024/06/06 17:05


转载请注明出处!毕竟是我的心血啊!

原文链接:http://blog.csdn.net/zgyulongfei/article/details/7440254


写这篇博客的目的是希望可以帮助到那些在将x264移植到Android过程中遭遇坎坷还没有成功的朋友们,同时也算是对我这段时间学习的一个总结。

--------------------------------------------------------------------------------------

首先,先贴上我的编译环境:

操作系统:ubuntu 11.10

jdk:jdk-6u31-linux-i586

eclipse:eclipse-SDK-3.7.2-linux-gtk

ndk:由于ndk版本不断提高,但不同版本ndk的目录结构和使用的gcc又不尽相同,本文将对两个版本的ndk分别进行介绍(android-ndk-r4b-linux-x86 与 android-ndk-r6-linux-x86),你可以根据自己的ndk目录进行配置。

x264源码:last_x264

--------------------------------------------------------------------------------------

记得上课的时候王老师说过一句话:“忘了过去的苦难,就是未来的灾难!”。

为了让我的未来没有灾难,我将记录下在编译过程遭受的苦难 ^_^

(1)最开始的时候我是在windows 7 + cygwin环境下编译的,但是一直没有成功,可能是因为不太相信cygwin这样的模拟环境,我终于决定转战linux,于是在linux的世界里从此就诞生了一名菜鸟,可正是如此,才有了下面的故事……

(2)因为初次接触linux,我就像一个丈二的和尚努力地去摸我的头脑,说实话,摸得可真够累的,真是太习惯了windows傻瓜式的操作方法了!!!然后我就瞎搞胡搞,总算是有些熟悉linux环境了。

(3)刚开始编译x264的时候,很happy的在google百度上找了一些编译的方法,比如这篇《编译x264》,什么都不管就照着上面的做。直接 ./configure 之后就 make, 看到生成了libx264的库,比见到鬼还高兴,可是当用ndk编译调用libx264的jni的时候,就乱七八糟的一大堆错误 = =.|| ,然后还一直找这些莫名其妙错误的解决方案。当然,最后没有好结果 Orz.  

(PS:我这里要批评一下GFW,你妹的我用google刚刚谷了一会儿点击结果弹出的页面显示的都是:无法访问此网页,DNS查找失败……!!!)

(4)在第3步纠结了很久,后来知道用./configure编译使用的是默认的gcc编译器集,而gcc编译出来的文件是在本地执行的,因为产生的是x86的二进制文件。而我们移植的x264并不是在本地使用,因此需要交叉移植,交叉移植?神马? 知道了在linux下交叉编译需要用到arm-linux-gcc,果断找用arm-linux-gcc编译x264的文章《交叉编译x264文件》,原来在make之前得先将config.mak里面的gcc全部改成arm-linux-gcc,还有其他一些也得修改为arm-linux-的编译器集。改了之后,我还是编译不过,因为我机器上没有这个编译器,于是下载arm-linux-gcc编译器,配置后环境后,再make了一次。这下我开心了半死,编译成功,胜利在望了有木有!!! ^_^

(5)将第4步编译好的libx264放到android里面调用,当用ndk编译调用libx264的jni的时候,成功生成了.so文件,这意味着我成功了吗??

(6)当我很开心的拿我的HTC G3安装运行生成的apk的时候,却出现了错误java.lang.unSatifiedLinkerror: libx264 not found。 我晕,我甚至将生成的apk解包,发现里面安安静静地躺着libx264啊,想起了《皇帝的新装》这个故事,皇帝明明没有穿衣服,人们硬要说他穿着漂亮的衣裳,尼玛我的libx264就放在那里,你硬要说它不在!??。这是肿么一回事,又找了许久资料不见解决之道。心都凉了有木有!!!

(7)咳,烦死了去洗了个澡。回来决定再试一次,于是百度到了这篇文章《compile libx264 with android-ndk-r4b》,因为很早就试过这篇文章的配置,发现出错了,于是放弃了。现在已经走投无路了,我就死马当做活马医。用这个配置运行后,出现错误arm-eabi-gcc:没有那个文件或目录。。。可是配置里面明明就有那个gcc啊,由于在用arm-linux-gcc的时候也有出现类似的错误,是因为没有这个库,现在有这个库了还说它不存在,这不是坑爹吗?然后我抱着试一试的态度将arm-eabi-的路径加入到PATH之后,然后再用这个配置文件编译了一次,TT太感动了,成功编译了,然后用编译好的库做测试运行成功了,运行成功了,成功了。。我高兴得晚上都睡不着觉。

(8)原来用arm-linux-gcc是在x86机器上编译可以在arm机器上运行的二进制代码,在android上运行不成功,是因为android不是arm平台吧?不知道我分析的对不对,如果有错,欢迎指正。另:有更多关于gcc, arm-linux-gcc, arm-eabi-gcc的相关知识也希望你能告诉我,给我这个linux菜鸟上个课 ^_^

(9)总结:x264移植到Android下用的不是gcc,不是arm-linux-gcc,而是arm-eabi-gcc。

--------------------------------------------------------------------------------------

唠叨了这么久,终于要进入正题了 Orz

本文介绍的编译方式最后生成的是静态库,如果需要编译成动态库的朋友可以点击这里,不过这篇文章只介绍了编译的思路,并没有提供确切地方法,需要的朋友还得自己去琢磨咯!


【一:使用ndk-r4b编译x264】

步骤:

1,将x264压缩包解压,假设解压后的目录为libx264。

2,在libx264目录下新建一个脚本文件myconfig.sh,然后将《compile libx264 with android-ndk-r4b》里面的代码贴到myconfig.sh里面。

3,将第一句配置 export ARM_ROOT=/home/frank/android-ndk-r4b 改成你ndk-r4b的路径。

4,打开终端,并将终端定位到libx264的目录下,输入 sudo sh ./myconfig.sh

5,当提示可以运行make的时候,输入make

6,如果程序可以很正常的编译,那么恭喜你,你已经成功了,你可以不用看下面的内容了;如果输入make之后,看到这些信息:/bin/sh:arm-eabi-gcc:未找到命令,那么你和我一样遇到了这个问题,请继续看第7步。

7,在终端输入: sudo gedit  /etc/profile ,在打开的文本中定位到文件末尾,输入以下脚本

#set arm-eabi-gcc environment
export ARM_EABI_GCC=/opt/java/ndk/android-ndk-r4b/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
export PATH=$ARM_EABI_GCC:$PATH

注意:ARM_EABI_GCC中的/opt/java/ndk/android-ndk-r4b是我ndk-r4b的路径,你要根据自己ndk路径修改!

保存后关闭文本。这一步的目的是为arm-eabi-gcc添加环境变量。

8,上一步修改的配置需要重启电脑才能生效,为了能够使其立即生效,需要在终端输入:source /etc/profile,接着输入:echo $PATH 查看ARM_EABI_GCC的路径是否有在输出的内容中,如果有,则看第9步,否则认真检查,重新配置一下环境变量。

9,环境变量配置好了之后,输入命令:make,如果不再提示说arm-eabi-gcc未找到命令而且看到程序正在编译,那么恭喜你,你将成功编译libx264.

10,我编译好的 libx264.a 文件的大小为773.8k, 你的呢? ^_^


【二:使用ndk-r6编译x264】

ndk-r6用到的不再是arm-embi-gcc,而是arm-linux-androideabi-gcc。具体编译步骤还请查看【一:用ndk-r4b编译】,只不过用的myconfig.sh不同,以及ARM_EABI_GCC不同。

这里我贴上用ndk-r6编译的myconfig.sh脚本:

#------------------------------myconfig.sh------------------------------

export ARM_ROOT=/opt/java/ndk/android-ndk-r6
export ARM_INC=$ARM_ROOT/platforms/android-8/arch-arm/usr/include/
export ARM_LIB=$ARM_ROOT/platforms/android-8/arch-arm/usr/lib/
export ARM_TOOL=$ARM_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
export ARM_LIBO=$ARM_TOOL/lib/gcc/arm-linux-androideabi/4.4.3
export PATH=$ARM_TOOL/bin:$PATH
export ARM_PRE=arm-linux-androideabi

./configure --disable-gpac --extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__  -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID  -Wa,--noexecstack -MMD -MP " --extra-ldflags="-nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o -lc -lm -ldl -lgcc" --cross-prefix=${ARM_PRE}- --disable-asm --host=arm-linux --disable-shared

#------------------------------myconfig.sh-----------------------------

注意:第一句ARM_ROOT还是得根据你ndk-r6的位置进行配置

另外,贴上/etc/profile中需要添加的配置:

#set arm-linux-androideabi-gcc
export ARM_LINUX_ANDROIDEABI_GCC=/opt/java/ndk/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin
export PATH=$ARM_LINUX_ANDROIDEABI_GCC:$PATH

我用ndk-r6编译好的libx264.a大小为778.6k,你可以参考一下你编译好的文件大小。

--------------------------------------------------------------------------------------

本文算是结束了,如果你通过本文成功编译好了libx264,那么:“亲,别忘了给个好评哦!^_^”



0 0
原创粉丝点击