在Linux下用NDK编译第三方库(合集)

·  阅读 1193

文章持续更新!
每编译一个第三方库,更新一回,完整记录如何使用NDK将第三方C/C++库编译成动/静态链接库。

前言

在之前一篇文章《在Linux下进行NDK编译》,我们配制了Linux(CentOS 7)的NDK编译环境,强调了在Linux环境行进行NDK编译的重要性,并且逐步安装了必要的组件,在文章最后,我们还以FFmpeg为例,完成了一次编译。在这篇文章中,我们继续深入细节去探讨:

  • 如何看configure文件的--help?
  • 一般哪些属性需要我们格外注意?
  • 如何编写一个shell脚本?

x264

2.1 简介

H.264ITU(International Telecommunication Union,国际通信联盟)和MPEG(Motion Picture Experts Group,运动图像专家组)联合制定的视频编码标准。而x264是一个开源的视频编码函数库,是最好的有损视频编码器之一。在FFmpeg中同样实现了H.264的编码,同时FFmpeg也能够集成X264。

2.2 开始编译

默认已经在Linux环境下配制好了相关组件,详见在Linux下进行NDK编译

2.2.1 下载源码

进入你希望将源码存放的位置,我选择我的download文件夹;

cd download
复制代码

开始git clone;

git clone https://code.videolan.org/videolan/x264.git
复制代码

完成后进入x264文件夹,并查看文件夹内容;

cd x264
ll
复制代码

文件夹内容如下所示。

[tongbo@localhost x264]$ ll
总用量 356
-rw-rw-r--. 1 tongbo tongbo  1998 12月 26 17:17 AUTHORS
-rw-rw-r--. 1 tongbo tongbo 10589 12月 26 17:17 autocomplete.c
drwxrwxr-x. 8 tongbo tongbo  4096 12月 26 17:17 common
-rwxrwxr-x. 1 tongbo tongbo 45003 12月 26 17:17 config.guess
-rwxrwxr-x. 1 tongbo tongbo 35758 12月 26 17:17 config.sub
-rwxrwxr-x. 1 tongbo tongbo 51871 12月 26 17:17 configure
-rw-rw-r--. 1 tongbo tongbo 17992 12月 26 17:17 COPYING
drwxrwxr-x. 2 tongbo tongbo   111 12月 26 17:17 doc
drwxrwxr-x. 2 tongbo tongbo  4096 12月 26 17:17 encoder
-rw-rw-r--. 1 tongbo tongbo  4172 12月 26 17:17 example.c
drwxrwxr-x. 2 tongbo tongbo   171 12月 26 17:17 extras
drwxrwxr-x. 3 tongbo tongbo    53 12月 26 17:17 filters
drwxrwxr-x. 2 tongbo tongbo   137 12月 26 17:17 input
-rw-rw-r--. 1 tongbo tongbo 13124 12月 26 17:17 Makefile
drwxrwxr-x. 2 tongbo tongbo   193 12月 26 17:17 output
drwxrwxr-x. 3 tongbo tongbo   273 12月 26 17:17 tools
-rwxrwxr-x. 1 tongbo tongbo   854 12月 26 17:17 version.sh
-rw-rw-r--. 1 tongbo tongbo 91346 12月 26 17:17 x264.c
-rw-rw-r--. 1 tongbo tongbo  3182 12月 26 17:17 x264cli.h
-rw-rw-r--. 1 tongbo tongbo  1910 12月 26 17:17 x264dll.c
-rw-rw-r--. 1 tongbo tongbo 47459 12月 26 17:17 x264.h
-rw-rw-r--. 1 tongbo tongbo  2656 12月 26 17:17 x264res.rc
复制代码

2.2.2 查看configure文件

注意!并不是所有的库都已经存在configure文件,之种情况请首先阅读库的Readme文档。有的库可能只存在configure.ac和makefile.am。这种情况需要借助autoconf命令来生成configure。大概的流程如下 (后缀*代表执行过程,[]代表可选项),详见Autoconf简介

your source files --> [autoscan*] --> [configure.scan] --> configure.ac

configure.ac --·
               |   ·------> autoconf* -----> configure
[aclocal.m4] --+---+
               |   ·------> [autoheader*] --> [config.h.in]
[acsite.m4] ---·

Makefile.in
复制代码

总之,在得到configure文件之后,执行:

./configure --help
复制代码

查看该配置文件开放的参数详情,x264库configure的参数情况如下所示。

[tongbo@localhost x264]$ ./configure --help
Usage: ./configure [options]

Help:
  -h, --help               print this message

Standard options:
  --prefix=PREFIX          install architecture-independent files in PREFIX
                           [/usr/local]
  --exec-prefix=EPREFIX    install architecture-dependent files in EPREFIX
                           [PREFIX]
  --bindir=DIR             install binaries in DIR [EPREFIX/bin]
  --libdir=DIR             install libs in DIR [EPREFIX/lib]
  --includedir=DIR         install includes in DIR [PREFIX/include]
  --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS
  --extra-rcflags=ERCFLAGS add ERCFLAGS to RCFLAGS

Configuration options:
  --disable-cli            disable cli
  --system-libx264         use system libx264 instead of internal
  --enable-shared          build shared library
  --enable-static          build static library
  --disable-opencl         disable OpenCL features
  --disable-gpl            disable GPL-only features
  --disable-thread         disable multithreaded encoding
  --disable-win32thread    disable win32threads (windows only)
  --disable-interlaced     disable interlaced encoding support
  --bit-depth=BIT_DEPTH    set output bit depth (8, 10, all) [all]
  --chroma-format=FORMAT   output chroma format (400, 420, 422, 444, all) [all]

Advanced options:
  --disable-asm            disable platform-specific assembly optimizations
  --enable-lto             enable link-time optimization
  --enable-debug           add -g
  --enable-gprof           add -pg
  --enable-strip           add -s
  --enable-pic             build position-independent code

Cross-compilation:
  --host=HOST              build programs to run on HOST
  --cross-prefix=PREFIX    use PREFIX for compilation tools
  --sysroot=SYSROOT        root of cross-build tree

External library support:
  --disable-avs            disable avisynth support
  --disable-swscale        disable swscale support
  --disable-lavf           disable libavformat support
  --disable-ffms           disable ffmpegsource support
  --disable-gpac           disable gpac support
  --disable-lsmash         disable lsmash support

[tongbo@localhost x264]$ 
复制代码

2.2.3 配置参数介绍

__parameter_names __parameter_introduction
--prefix 一般规范的配置脚本都会存在这个参数,用于设置编译结果的输出目录;
--extra-cflags 一般形如CFlags的参数,都是对编译器设置参数的,比如“-L”参数和“-I”参数;
--disable-cli cli是命令行界面(Command-Line Interface, CLI)的意思,所以这个配置是关闭编译命令行工具,我们在Android中使用,是自己编写代码,而不是借助命令行工具,所以可以加上这个配置(不加也没事,编译出来不用就行了);
--enable-shared 是否生成动态链接库;
--enable-static 是否生成静态链接库;
--enable-debug 为编译器添加“-g”参数;
--enable-gprof 为编译器添加“-pg”参数;
--enable-strip 为编译器添加“-s”参数;
--enable-pic 为编译器添加“-fPIC”参数,这里我们记住一点:如果编译Android使用的动态库,则使用PIC;如果编译Android可用的命令行工具,使用PIE。

2.2.4 shell脚本

  • 新建一个shell脚本,并进入编辑
[tongbo@localhost x264]$ touch build_bash.sh
[tongbo@localhost x264]$ vim build_bash.sh
复制代码
  • 编辑shell脚本
#!/bin/bash
#NDK目录,使用之前环境变量中配置的NDKROOT
NDK_ROOT=$NDKROOT

#编译后安装位置 pwd表示当前目录
PREFIX=`pwd`/android/armeabi-v7a

#目标平台版本,我们将兼容到android-21
API=21

#编译工具链目录
TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64

#小技巧,创建一个AS的NDK工程,执行编译,然后在 app/.cxx/cmake/debug(release)/自己要编译的平台/ 目录下自己观察 build.ninja与 rules.ninja
FLAGS="--target=armv7-none-linux-androideabi21 --gcc-toolchain=$TOOLCHAIN -g -DANDROID -fdatasections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -Oz -DNDEBUG -fPIC "

#虽然x264提供了交叉编译配置:--cross-prefix,如--corss-prefix=/NDK/arm-linux-androideabi-
#那么则会使用 /NDK/arm-linux-androideabi-gcc 来编译
#然而ndk19开始gcc已经被移除,由clang替代。
#小常识:一般的库都会使用$CC 变量来保存编译器,我们自己设置CC变量的值为clang。
export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++

#--extra-cflag会附加到CFLAGS 变量之后,作为传递给编译器的参数,所以就算有些库没有--extra-cflags配置,我们也可以自己创建变量CFLAGS传参。
./configure \
--prefix=$PREFIX \
--disable-cli --enable-static \
--enable-pic \
--host=arm-linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$TOOLCHAIN/sysroot \
--extracflags="$FLAGS"

make install
复制代码
  • 记得esc :wq保存退出

2.2.5 执行编译并使用库

  • 添加执行权限并执行build_bash.sh文件
[tongbo@localhost x264]$ chmod +x build_bash.sh
[tongbo@localhost x264]$ ./build_bash.sh
复制代码
[tongbo@localhost x264]$ cd android
[tongbo@localhost android]$ sudo cp -r armeabi-v7a /samba
复制代码

FAAC

3.1 简介

FAAC官网

FAAC is an open-source MPEG-4 and MPEG2 AAC au­dio en­co­der. Note that the quality of FAAC is not up to par with the currently best AAC encoders available.

Features:

  • Portable
  • Reasonably fast
  • LC, Main, LTP support
  • DRM support through DreaM

3.2 开始编译

3.2.1 下载源码

  • wget下载
[tongbo@localhost download]$ wget https://nchc.dl.sourceforge.net/project/faac/faac-src/faac-1.29/faac-1.29.9.2.tar.gz
复制代码
  • 解压
[tongbo@localhost download]$ tar xvf faac-1.29.9.2.tar.gz
复制代码
  • 进入FAAC目录
[tongbo@localhost download]$ cd faac-1.29.9.2
复制代码
  • 源码全部内容
[tongbo@localhost faac-1.29.9.2]$ ll
总用量 1512
-rw-r--r--. 1 tongbo tongbo 373964 11月 14 2017 aclocal.m4
-rw-r--r--. 1 tongbo tongbo   1297 9月   2 2017 AUTHORS
-rw-r--r--. 1 tongbo tongbo   2278 11月  3 2017 ChangeLog
drwxr-xr-x. 2 tongbo tongbo     44 11月 14 2017 common
-rwxr-xr-x. 1 tongbo tongbo   7333 9月  17 2017 compile
-rwxr-xr-x. 1 tongbo tongbo  43940 11月 13 2016 config.guess
-rw-r--r--. 1 tongbo tongbo   3530 11月 14 2017 config.h.in
-rwxr-xr-x. 1 tongbo tongbo  36339 11月 13 2016 config.sub
-rwxr-xr-x. 1 tongbo tongbo 603816 11月 14 2017 configure
-rw-r--r--. 1 tongbo tongbo   1691 11月 14 2017 configure.ac
-rw-r--r--. 1 tongbo tongbo  25292 7月   5 2017 COPYING
-rwxr-xr-x. 1 tongbo tongbo  23567 9月  17 2017 depcomp
drwxr-xr-x. 2 tongbo tongbo     20 11月 14 2017 docs
drwxr-xr-x. 2 tongbo tongbo    224 11月 14 2017 frontend
drwxr-xr-x. 2 tongbo tongbo     75 11月 14 2017 include
-rw-r--r--. 1 tongbo tongbo    757 9月   2 2017 INSTALL
-rwxr-xr-x. 1 tongbo tongbo  15155 9月  17 2017 install-sh
drwxr-xr-x. 3 tongbo tongbo   4096 11月 14 2017 libfaac
-rw-r--r--. 1 tongbo tongbo 324412 8月  20 2016 ltmain.sh
-rw-r--r--. 1 tongbo tongbo     42 9月  23 2017 Makefile.am
-rw-r--r--. 1 tongbo tongbo  25303 11月 14 2017 Makefile.in
-rwxr-xr-x. 1 tongbo tongbo   6872 9月  17 2017 missing
-rw-r--r--. 1 tongbo tongbo    196 11月  2 2017 NEWS
-rw-r--r--. 1 tongbo tongbo   3031 7月  24 2017 README
-rw-r--r--. 1 tongbo tongbo    274 11月 10 2017 TODO
[tongbo@localhost faac-1.29.9.2]$ 
复制代码

3.2.2 查看configure文件

  • ./configure --help
[tongbo@localhost faac-1.29.9.2]$ ./configure --help
`configure' configures faac 1.29.9.2 to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc.  You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/faac]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-silent-rules   less verbose build output (undo: "make V=1")
  --disable-silent-rules  verbose build output (undo: "make V=0")
  --enable-drm            Digital Radio Mondiale support
  --enable-dependency-tracking
                          do not reject slow dependency extractors
  --disable-dependency-tracking
                          speeds up one-time build
  --enable-shared[=PKGS]  build shared libraries [default=yes]
  --enable-static[=PKGS]  build static libraries [default=yes]
  --enable-fast-install[=PKGS]
                          optimize for fast installation [default=yes]
  --disable-libtool-lock  avoid locking (might break parallel builds)
  --disable-largefile     omit support for large files

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                          both]
  --with-aix-soname=aix|svr4|both
                          shared library versioning (aka "SONAME") variant to
                          provide on AIX, [default=aix].
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
                          compiler's sysroot if not specified).

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  LT_SYS_LIBRARY_PATH
              User-defined run-time library search path.
  CPP         C preprocessor
  CXXCPP      C++ preprocessor

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to <https://sourceforge.net/p/faac/bugs/>.
[tongbo@localhost faac-1.29.9.2]$ 
复制代码

3.2.3 配置参数介绍

3.2.4 shell脚本

  • 新建build_bash.sh,并进入编辑
[tongbo@localhost faac-1.29.9.2]$ touch build_bash.sh
[tongbo@localhost faac-1.29.9.2]$ vim build_bash.sh
复制代码
  • 编辑build_bash.sh
#!/bin/bash
#NDK目录,使用之前环境变量中配置的NDKROOT
NDK_ROOT=$NDKROOT

#编译后安装位置 pwd表示当前目录
PREFIX=`pwd`/android/armeabi-v7a

#目标平台版本,我们将兼容到android-21
API=21

#编译工具链目录
TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64

#小技巧,创建一个AS的NDK工程,执行编译,然后在 app/.cxx/cmake/debug(release)/自己要编译的平台/ 目录下自己观察 build.ninja与 rules.ninja
FLAGS="--target=armv7-none-linux-androideabi21 --gcc-toolchain=$TOOLCHAIN -g -DANDROID -fdatasections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -Oz -DNDEBUG -fPIC "

#虽然x264提供了交叉编译配置:--cross-prefix,如--corss-prefix=/NDK/arm-linux-androideabi-
#那么则会使用 /NDK/arm-linux-androideabi-gcc 来编译
#然而ndk19开始gcc已经被移除,由clang替代。
#小常识:一般的库都会使用$CC 变量来保存编译器,我们自己设置CC变量的值为clang。
export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++

./configure --prefix=$PREFIX \
--enable-static=yes \
--enable-shared=no \
--host=arm-linux

make install
复制代码
  • esc :wq保存退出

3.2.5 执行编译并使用库

  • 添加执行权限
[tongbo@localhost faac-1.29.9.2]$ chmod +x build_bash.sh
复制代码
  • 执行
[tongbo@localhost faac-1.29.9.2]$ ./build_bash.sh
复制代码
  • 查看编译结果
[tongbo@localhost faac-1.29.9.2]$ cd android
[tongbo@localhost android]$ ll
总用量 0
drwxrwxr-x. 6 tongbo tongbo 56 12月 28 21:32 armeabi-v7a
[tongbo@localhost android]$ cd armeabi-v7a
[tongbo@localhost armeabi-v7a]$ ll
总用量 0
drwxrwxr-x. 2 tongbo tongbo 18 12月 28 21:32 bin
drwxrwxr-x. 2 tongbo tongbo 37 12月 28 21:32 include
drwxrwxr-x. 2 tongbo tongbo 41 12月 28 21:32 lib
drwxrwxr-x. 3 tongbo tongbo 17 12月 28 21:32 share
[tongbo@localhost armeabi-v7a]$ cd lib
[tongbo@localhost lib]$ ll
总用量 84
-rw-r--r--. 1 tongbo tongbo 80264 12月 28 21:32 libfaac.a
-rwxr-xr-x. 1 tongbo tongbo   928 12月 28 21:32 libfaac.la
[tongbo@localhost lib]$ 
复制代码
[tongbo@localhost android]$ mkdir faac
[tongbo@localhost android]$ cp -r armeabi-v7a faac
[tongbo@localhost android]$ cp -r faac /samba
复制代码
分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改