Android studio3.0+ 编译Lame库(CMake方式)

最近在学习音视频方面的知识,购买了音视频开发进阶指南,在交叉编译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库是采用旧的编译方式,贼难玩,希望这个可帮助到你。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值