在Android-x86 NDK编译中使用YASM

来源:互联网 发布:c语言程序生成exe文件 编辑:程序博客网 时间:2024/05/23 23:06

在PC平台上,游戏和多媒体应用使用了大量的SIMD(Single Instruction Multiple Data)指令来提高运行速度。但是将这些旨在提高应用运行性能的SIMD代码移植到Android x86平台的时候,我们往往不得不放弃这些代码,从android-ndk-r9d开始,采用yasm提供在Android x86平台下NDK编译时对汇编的支持。

一、什么是YASM编译器

Yasm是一个完整的重写的NASM汇编器,它是一个基于DSD协议下的开源软件,其官网地址为 http://yasm.tortall.net。
Yasm当前支持x86和AMD64指令集,支持NASM和GAS汇编符号,输出包括: ELF32, ELF64, 32和64位Mach-O, RDOFF2, COFF, Win32和Win64等二进制目标格式,并可以生成在STABS, DWARF2和 CodeView 8格式的源代码调试信息。
Yasm也提供了一些常用的数学函数,比如FFT变换,开发者只需要在代码中直接调用这些函数就可以获得最好的执行效率,一些众所周知的开源项目,比如FFMEG,X264,MPC-HC等使用Yasm汇编。

二、在Android NDK (x86) 中使用压 yasm

以FFMPEG为例,通常需要添加–disable-yasm选项,在编译arm版本时,这是正确也是必须的(arm 使用neon),但是在编译x86版本时,disable-yasm将导致大量的SIMD优化代码无法使用,从而显著降低性能。因此我们需要在Android NDK编译中添加ASM汇编支持。
从http://yasm.tortall.net下载Yasm, 将yasm.exe文件复制到系统目录下,比如system32下,这样就无需指定yasm.exe文件的所在路径。

使用yasm编译FFMPEG, 不再加上–disable-asm, 重新配置FFMPEG,可以看到在配置好的config.h中#define HAVE_YASM 1。在config.mk包含HAVE_YASM=yes。
定义LOCAL_YASMFLAGS = -DANDROID -DPIC -DHAVE_AV_CONFIG_H -DARCH_X86_32,重新执行ndk-build就可以得到在Android x86平台下完全优化的FFMPEG库。

原创粉丝点击