无论是自行安装PC上的编译器,还是下载其他平台的交叉编译链,它们都会提供下面几个工具:
- CC
编译器,对C源文件进行编译处理,生成汇编文件
- AS
将汇编文件生成目标文件
- AR
打包器,用于库操作
- LD
链接器,为前面生成的目标代码分配地址空间,将多个目标文件链接成一个库或者是可执行文件
- GDB
调试工具
- STRIP
最终生成的可执行文件或者库文件作为输入,然后消除掉其中的源码
- NM
查看静态库文件中的符号表
- Objdump
查看静态库或者动态库中的方法名
在编译之前,我们先看看LAME、FDK_ACC等这些的概念简介:
- LAME
是目前非常优秀的一种MP3编译引擎,在业界,转码成 MP3格式的音频文件时,最常用的编码器就是LAME库。当达到320Kbits/s以上时,LAME编码出来的音频质量几乎可以CD的音质相媲美。并且保证整个音频文件的体积非常小。
因此若要在移动平台上编码 MP3文件,使用LAME便成为唯一选择。
- FDK_ACC
FDK_ACC 是用来编码和解码的AAC格式音频文件的开源库。
- X264
X264是一个开源的H.264/MPEG-4 AVC视频编码函数库,是最好的有损视频编码器之一。一般的输入的视频帧是YUV,输出是编码之后的 H264的数据包,并且支持 CBR、VBR模式,可以在编码的过程中直接改变码率的设置,这点在直播的场景中是非常实用的(直播场景下利用该特点可以做码率自适应)
了解完这些后,我们在来看看Android NDK下一些经常会用到的组件:
-
ARM、x86的交叉编译器
-
构建系统
-
Java原生接口文件
-
C库
-
Math库
-
最小的C++库
-
ZLib压缩库
-
POSIX线程
-
Android日志库
-
Android原生应用Api
-
OpenGL ES库
-
OpenSL ES库
先去 传送门 下载好LAME的源码然后解压缩。
解压完后将 libmp3lame
文件夹下的所有的 带 .h
和带 .c
的 C/C++文件 和 include
下的lame.h
复制到 JNI目录下(最好再统一放到一个新的子目录下,这边就放到了 lame子目录下),因为添加了这么多的文件,那么需要把这些文件写入到CMake的 add_library
:
add_library( # Sets the name of the library.
mp3_encoder
Sets the library as a shared library.
SHARED
Provides a relative path to your source file(s).
src/main/jni/Mp3Encoder.cpp
src/main/jni/lame/bitstream.c src/main/jni/lame/encoder.c
src/main/jni/lame/fft.c src/main/jni/lame/gain_analysis.c
src/main/jni/lame/id3tag.c src/main/jni/lame/la