为X86 Android*编译开源库





0/5 (0投票)
在本文中,我们将向您展示如何为 x86 Android 平台编译一些知名的开源库。
引言
Android 正在成为一个流行的移动平台。借助 Android Developer Tools 中的 NDK 组件,理论上用 C 和 C++ 等原生编程语言编写的开源库在 Android 平台上可用。在本文中,我们将向您展示如何为 x86 Android 平台编译一些知名的开源库。
FFmpeg 编译
FFmpeg 是一个免费的开源跨平台音频和视频流解决方案,使用 LGPL 或 GPL(取决于您选择的组件)。FFmpeg 提供音频和视频的录制、转换和流式传输功能。
大多数开源解决方案都支持交叉编译;但 FFmpeg 使之更加容易。这是一个您可以在 Linux* 上用于构建 FFmpeg 的脚本文件
#!/bin/bash
NDK=$ANDROID_NDK_ROOT #your ndk root path
PLATFORM=$NDK/platforms/android-14/arch-x86
PREBUILT=$NDK/toolchains/x86-4.4.3/prebuilt/linux-x86
function build_one
{
./configure --target-os=linux
--prefix=$PREFIX
--enable-cross-compile
--extra-libs="-lgcc"
--arch=x86
--cc=$PREBUILT/bin/i686-android-linux-gcc
--cross-prefix=$PREBUILT/bin/i686-android-linux-
--nm=$PREBUILT/bin/i686-android-linux-nm
--sysroot=$PLATFORM
--extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS "
--disable-shared --enable-static
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm"
--disable-ffplay --disable-avfilter --disable-avdevice --disable-ffprobe
--enable-asm
--enable-yasm
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4 install
}
#x86
CPU=x86
OPTIMIZE_CFLAGS="-march=atom -ffast-math -msse3 -mfpmath=sse"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one
运行此脚本后,您将获得 libavcode.a、libavformat.a、libavutil.a、libswresample.a 和 libswscale.a 文件。将这些库链接到您的项目作为预链接的静态库,以获得 FFmpeg 动态库。
为获得最佳性能,请使用“enable-asm”和“enable-yasm”。您必须在 Linux 系统上安装 yasm。注意!启用 yasm 时,旧版本的 FFmpeg 会出现编译错误。更改 mpegaudiodsp.c 并删除这些代码行
#if HAVE_SSE2_INLINE
if (cpu_flags & AV_CPU_FLAG_SSE2) {
s->apply_window_float = apply_window_mp3;
}
#endif /* HAVE_SSE2_INLINE */
Speex 编译
Speex 是一款免费的语音编解码器,广泛用于 VoIP 和录音机应用程序。大多数开发人员使用 NDK 构建 speex。请阅读 http://wang-peng1.iteye.com/blog/2040718 以获取更多详细信息(此博客为中文,但可轻松使用 Google 翻译阅读)。此页面显示了一个 ARM* 构建脚本。要构建 x86 库,您必须添加“-DFLOATING_POINT=1 -D_USE_SSE -D_USE_SSE2”。我们认为这不是构建 speex 库的最佳解决方案。如果您自己编写构建脚本,那就更好了,但这对于大多数开发人员来说并不容易。因此,在 Linux 系统上进行交叉编译是更好的选择。在本文中,我们将逐步告诉您如何编写交叉编译脚本。
首先,请访问 http://www.speex.org/downloads/ 和 http://www.linuxfromscratch.org/blfs/view/svn/multimedia/libogg.html 下载源文件。Speex 需要 libogg 库,因此也请下载 libogg 文件。libogg 的构建脚本如下
#!/bin/bash
export ANDROID_NDK=/home/lym/android-ndk-r9d
PREBUILT=$ANDROID_NDK/toolchains/x86-4.6/prebuilt/linux-x86_64
PLATFORM=$ANDROID_NDK/platforms/android-9/arch-x86
export CFLAGS="-L$PLATFORM/usr/lib -I$PLATFORM/usr/include -I$PREBUILT/lib/gcc/i686-linux-android/4.6/include-fixed --sysroot=$PLATFORM -std=c99"
export CC=$PREBUILT/bin/i686-linux-android-gcc
export AR=$PREBUILT/bin/i686-linux-android-ar
export AS=$PREBUILT/bin/i686-linux-android-as
export LD=$PREBUILT/bin/i686-linux-android-ld
export RANLIB=$PREBUILT/bin/i686-linux-android-ranlib
export NM=$PREBUILT/bin/i686-linux-android-nm
export STRIP=$PREBUILT/bin/i686-linux-android-strip
./configure --host=x86-linux
--with-sysroot=$PLATFORM/
--prefix=/home/lym/work/Third_party_lib/speex-1.2rc1/build/x86_ogg/
echo "config sucess..."
make clean
make install
这是编译大多数开源项目的通用构建脚本。请更改路径中的 ANDROID_NDK,并添加“--sysroot=$PLATFORM -std=c99”,以便 gcc 可以找到正确的库和头文件。“std=c99”允许您使用更灵活的语法,例如“for(int i = ...)”。
有关如何编写“./configure”的信息,请参阅 libogg 网站。“--host=x86-linux”必须添加才能支持 x86 库的编译。“--prefix" 将设置最终的输出位置。当您运行此脚本时,您将在 prefix 路径中获得“lib”和“include”文件夹。
现在要构建 speex,请编辑并重用上面显示的通用构建脚本。首先,您必须在 CFLAGS 中添加 libogg 库和头文件路径。运行编译命令后,您可能会遇到找不到某些头文件的错误。将“-I$PLATFORM/usr/include -I$PREBUILT/lib/gcc/i686-linux-android/4.6/include-fixed -I/usr/include --sysroot=$PLATFORM”添加到 CFLAGS。对于任何找不到的头文件,只需添加其相应的路径。
接下来,根据 speex 官方网站的建议,将以下行添加到 configure 命令
--disable-oggtest
--disable-fixed-point
--enable-float-api
--enable-sse
“enable-sse”将在 X86 设备上获得最佳性能,并且 x86 处理器支持硬件浮点,因此请使用“enable-float-api”。同时将“-DM_PI=3.14159263”添加到 CFLAGS。scal.c 文件中缺少宏定义。最后,最后一个错误是“stderr”无法链接。您必须逐个更改源代码,并删除 os_support.h 和其他一些文件中的“stderr”。libspeex.a 将在 prefix 位置生成。
WebP 编译
WebP 是一种新的图像格式,可为 Web 上的图像提供无损和有损压缩。请访问 https://developers.google.com/speed/webp/download 获取 WebP 库和实用程序的源代码。因为 WebP 提供了一个 Android.mk 文件,所以为 Android 编译 WebP 很容易。将 WebP 复制到项目下的 jni 中,并确保将 abi=x86 添加到 application.mk 中。在构建应用程序后,将生成 libwebp.so。
LAME 编译
LAME 是一个高质量的 MPEG Audio Layer III (MP3) 编码器,在 LGPL 许可下。要为 X86 Android 编译 LAME,请按照以下步骤操作
- 从该网站下载并解压最新的 LAME 源代码:http://lame.sourceforge.net/download.php
- 将所有源代码复制到您 Android 项目的“jni”子文件夹中。
- 在“jni”文件夹中创建一个 Android.mk 文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmp3lame
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/
LOCAL_SRC_FILES :=
./libmp3lame/bitstream.c
./libmp3lame/encoder.c
./libmp3lame/fft.c
./libmp3lame/gain_analysis.c
./libmp3lame/id3tag.c
./libmp3lame/lame.c
./libmp3lame/mpglib_interface.c
./libmp3lame/newmdct.c
./libmp3lame/presets.c
./libmp3lame/psymodel.c
./libmp3lame/quantize.c
./libmp3lame/quantize_pvt.c
./libmp3lame/reservoir.c
./libmp3lame/set_get.c
./libmp3lame/tables.c
./libmp3lame/takehiro.c
./libmp3lame/util.c
./libmp3lame/vbrquantize.c
./libmp3lame/VbrTag.c
./libmp3lame/version.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
在“jni”文件夹中创建一个 application.mk 文件,内容如下(只有一行,指定 X86 ABI)
APP_ABI := x86
编辑 jni\libmp3lame\ 文件夹中的 util.h 文件,替换第 574 行
extern ieee754_float32_t fast_log2(ieee754_float32_t x);
用
extern float fast_log2(float x);
在 Android 项目的根文件夹中运行 ndk-build 命令。然后将在 Android 项目的 libs/x86/ 文件夹中生成 libmp3lame.so。
结论
从上面的示例中,我们可以看出,为 x86 Android 平台编译开源库通常不需要花费太多精力。在某些情况下,它就像在 application.mk 文件中添加 X86 ABI 一样简单;而在其他情况下,可能需要进行一些更改,例如调整与 x86 相关的编译标志以获得更好的性能,编写交叉编译脚本等。
相关文章
为基于 Intel® Atom™ 的 Android* 平台创建硬件解码器——集成 FFmpeg 与 MediaCodec:https://software.intel.com/en-us/android/articles/creating-a-hardware-decoder-integrating-ffmpeg-with-mediacodec-for-intel-atom-based-android
开源项目 - LAME MP3 编码器优化:https://software.intel.com/en-us/blogs/2008/10/06/open-source-project-lame-mp3-encoder-optimization
参考文献
[1] FFmpeg: https://ffmpeg.net.cn/index.html [2] Speex: http://www.speex.org/ [3] WebP: https://developers.google.com/speed/webp/ [4] LAME: http://lame.sourceforge.net/
关于作者
李玉明和房江培是英特尔® Atom™ 处理器移动支持团队、开发者关系部、软件与解决方案事业部 (SSG) 的应用工程师。他们负责在英特尔® Atom™ 处理器上启用 Android 应用。他们专注于为 x86 Android 平台启用第三方 SDK 和开源库。
注意事项
本文档中的信息是与英特尔产品相关的信息。本文档不授予任何知识产权的许可,无论是明示的还是隐含的,无论是通过禁止反悔还是其他方式。除英特尔关于此类产品的销售条款和条件另有规定外,英特尔不承担任何责任,并否认与英特尔产品的销售和/或使用相关的任何明示或隐含的保证,包括但不限于对特定用途的适用性、适销性或对任何专利、版权或其他知识产权的侵权保证。
除非 Intel 书面同意,否则 Intel 产品不设计也不用于任何可能导致人员伤亡的应用程序。
英特尔可随时更改规格和产品描述,恕不另行通知。设计人员不得依赖标记为“保留”或“未定义”的任何功能或指令的缺失或特性。英特尔保留这些用于未来定义的权利,并且对于因其未来更改而引起的任何冲突或不兼容性不承担任何责任。此处的信息如有更改,恕不另行通知。请勿根据此信息最终确定设计。
本文档中描述的产品可能包含已知为勘误的设计缺陷或错误,这可能导致产品偏离已发布的规范。当前的已表征勘误可应要求提供。
请联系您当地的英特尔销售办事处或您的经销商以获取最新的规范,并在下订单前进行咨询。
可通过致电 1-800-548-4725 或访问:http://www.intel.com/design/literature.htm 获取带有订单号并在此文档中引用的文档副本或其他英特尔文献。
性能测试中使用的软件和工作负载可能已针对仅在英特尔微处理器上的性能进行了优化。性能测试,如 SYSmark* 和 MobileMark*,是使用特定的计算机系统、组件、软件、操作和功能测量的。对其中任何一个因素的任何更改都可能导致结果有所不同。您应该查阅其他信息和性能测试,以协助您全面评估您打算购买的产品,包括该产品与其他产品结合使用时的性能。
本文档中重印的任何软件源代码均根据软件许可证提供,并且只能根据该许可证的条款使用或复制。
Intel、Intel 徽标和 Atom 是 Intel Corporation 在美国和/或其他国家的商标。
版权所有 © 2014 英特尔公司。保留所有权利。
*其他名称和品牌可能被声明为他人的财产。