最近在学习音视频方面的知识,购买了音视频开发进阶指南,在交叉编译LAME库的时候,书中使用的还是旧版本的编译方式,现在android studio在2.2以后就开始使用CMake的编译方式了,如果您还不了解这种编译方式,可以去查看这个CMake介绍与使用,里面可以大致了解CMake是什么,怎么使用的。接下来就说一下自己在编译LAME库的时候踩的坑,以及正确的编译流程,本人亲测可用。
在这里要说的就是,如果你使用的是AndroidStudio 2.2以上的版本,那么只要在创建项目时选择“Include C++ Support”选项,然后不停点击下一步就可以创建一个使用CMake工具构建C\C++代码的项目。如果还是没有,需要您在SDK Manager中安装CMake工具。
1.下载。首先要下载LAME源码库,这里有两种方式进行下载
http://lame.sourceforge.net/download.php
http://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz
我采用的是第二种方式下载,下载下来的压缩包不大,2M以内。然后解压。
2.新建工程。需要使用android studio 大于2.2版本以上,新建工程时需要选择支持C++的复选框,否则你新建的就是一个普通的工程项目。新建工程build完成以后,如果你没有添加本地ndk的路径,就会出现问题,如果没有ndk,你可以到google的中国开发者官网进行下载然后配置ndk路径,如下:
1.ndk下载路径。https://developer.android.google.cn/ndk/downloads/
2.需要在项目中的如下地方进行配置:
点击图中的按钮,就会弹出如下窗口:
路径配置完成以后,点击ok,基本就配置完成ndk了,项目能够正常运行了。
2.现在开始进行lame的交叉编译了。
将下载的lame的包解压缩,然后找到libmp3lame文件夹,将里面的.c和.h文件全部复制到项目的cpp目录中(除了.c与.h的,其他都不要)。
注意:libmp3lame文件夹内还包含其他文件夹,不用管它。
然后,再找到include文件夹(与libmap3lame在同一级文件路径),将lame.h文件拷贝到cpp目录中。
接下来需要修改CMakeLists.txt的文件里的内容了,因为现在我们添加了这么多.c与.h的文件,需要将CMakeList.txt文件修改如下:
在add_library中进行如下文件的添加,如果你是为了整齐统一,放到一个文件夹下,如下所有:
我统一放到了lame文件夹下,那你在add_library下就需要修改成如下即可:
到此为止,lame的源码成功的加入到我们的项目中,但是此时你打开一些引入的文件,会看到有些地方报错,先别急,我们先完成下面的步骤再来解决这些问题,防止导入错误的文件,从而导致编译失败。
3.对移植过来的代码进行如下修改:
1.删除 fft.c 文件的 47 行的 include“vector/lame_intrin.h”
2.修改 set_get.h 文件的 24 行的 #include“lame.h”
3.将 util.h 文件的 574 行的”extern ieee754_float32_t fast_log2(ieee754_float32_t x);” 替换为 “extern float fast_log2(float x);”
4.需要修改app -> build.gradle文件为如下:
android {
...
defaultConfig {
...
externalNativeBuild{
cmake{
cppFlags "-frtti -fexceptions"
cFlags "-DSTDC_HEADERS"
}
}
}
}
添加如上语句后,进行构建,此时build会出现错误提示,进入到对应的文件中,对出现错误,使用快捷键提示,引入缺少的库即可,此处问题可能较多,但是都是未导入一些库的问题,引入lame库到此处,基本算是编译引入完成了。下面添加简单的测试一下是否引入并编译成功。
打开项目中的native-lib.cpp文件,做如下修改:
#include <jni.h>
#include <string>
#include "lame/lame.h"
extern "C" JNIEXPORT jstring
JNICALL
Java_com_superlink_audiomanager_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
// 引入如下代码 get_lame_version()
return env->NewStringUTF(get_lame_version());
}
运行到真机或者模拟器上,如果没有问题的话,将会看到屏幕上显示当前的lame库的版本好是3.99.5。
好了,这就是编译完成lame库了,如果你购买了《音视频 开发进阶指南 基于Android与iOS平台的实践》这本书,上面的编译lame库是采用旧的编译方式,贼难玩,希望这个可帮助到你。