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

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android studio3.0+ 编译Lame库(CMake方式) 的相关文章

  • 将roottools.jar导入Android Studio

    我正在尝试从这里导入 roottools https code google com p roottools https code google com p roottools jar 文件 到 Android Studio 项目 到目前为
  • 使用 cmake 处理头文件依赖关系

    我正在一个小型 C 项目上使用 CMake 到目前为止 它运行得很好 有一点点 x 当我更改头文件时 通常需要重新编译许多源文件 直接或间接包含它的文件 但是 cmake 似乎只检测到some的源文件被重新编译 导致损坏状态 我可以通过清除
  • “此版本中使用了已弃用的 Gradle 功能,使其与 Gradle 7.0 不兼容。” -反应-原生

    当我尝试运行反应本机应用程序时 我遇到此错误react native run android 我无法安装该应用程序 我正在尝试构建一个相机应用程序 我当前的react native版本 0 62 0 React cli版本 2 0 1 De
  • 删除 json 对象字符串中的“\”

    如何删除下面字符串中的特殊字符 String x message content toom recipients id 1000001865 room subject room 我使用了 x replaceAll 但它不起作用 您必须转义正
  • 在Android内存中存储gif图像

    我对安卓还很陌生 我想将图像保存到内存中 然后从内存中检索图像并将其加载到图像视图中 我已使用以下代码成功将图像存储在内存中 void saveImage String fileName img cnt jpg File file new
  • Mesibo 通话 UI 未更新

    我正在尝试更改 Mesibo Call UI 的配置 但它并没有改变 我尝试如下 MesiboCallConfig mesiboCallConfig new MesiboCallConfig mesiboCallConfig backgro
  • 通过我的应用程序以编程方式插入新联系人,而不使用 Intent

    我正在使用一个应用程序 与手机联系人进行交互 我想将新联系人添加到我的手机联系人列表中 我已经尝试过以下代码 但它不起作用 void addContact Context ctx PreviewContactModel model Arra
  • Android-全屏视频视图

    我正在尝试使此 VideoView 以全屏模式显示 public class ViewVideo extends Activity private String filename private static final int INSER
  • Android:拍照后调用裁剪活动

    我在解析拍摄照片的 uri 来裁剪活动时遇到问题 在我的应用程序中 用户可以拍摄一张照片或从图库中选择一张照片 然后裁剪并上传 一切听起来都很简单 从图库中选择时 图库应用程序会返回所选照片的 uri 如下所示 content media
  • 有没有办法替代Android中的标准Log?

    有没有办法以某种方式拦截对 android 中标准 Log 的调用并执行其他操作 在桌面 Java 中 人们通常会得到一些记录器 因此有多种方法可以安装不同的日志处理程序 实现 但是 Android似乎对Log有静态调用 我找不到任何有关替
  • 如何在我的 Android 应用程序中实现应用内购买?

    如何在我的 Android 应用程序中实现应用内购买 我提到 http developer android com guide market billing billing integrate html billing service ht
  • Android 导航回到 Activity;不要重新加载父级

    我有一个场景 我单击 ListFragment 并启动一个新的 Activity 如下所示 public void onListItemClick ListView l View v int position long id super o
  • AOSP 中 android.Build.SERIAL 何时何地生成?

    我知道android Build SERIAL是在第一次设备启动时生成的 但我无法准确定位位置和时间 我正在建造AOSP Jelly Bean Android平板电脑 nosdcard 第二个问题 这个是序列号吗 really对所有人来说都
  • 将 firebase auth 与 google app engine 云端点集成

    有人可以指定 使用一些示例代码 如何验证谷歌云端点中的 firebase 令牌吗 最近提出的问题根本没有澄清 如何将 Firebase 身份验证与 Google 应用引擎端点集成 https stackoverflow com questi
  • 返回主要活动(意图)时传递数据我做错了什么?

    我是安卓新手 这可能是最简单的问题 但我不明白这里出了什么问题 我试图创建一个通过意图传递值的基本示例 因此 当我关闭第二个活动时 我需要将数据传递到主活动 这是代码 意图测试1 主要活动 public void onClick View
  • 使用 DiffUtil 在 RecyclerView 上添加拖放

    我有一个从房间数据库更新的列表 我从 Room 收到更新的数据作为新列表 然后将其传递给列表适配器 https developer android com reference androidx recyclerview widget Lis
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • 在上下文操作模式下选择时,ListView 项目不会在视觉上“突出显示”

    我关注了 Android 官方网站创建上下文操作菜单的教程 http developer android com guide topics ui menus html CAB 使用下面的代码 当我长按我的 ListView 项目之一时 它确
  • Android BLE 扫描永远找不到设备

    几天以来 我尝试在我的应用程序中实现 BLE 连接 我知道我尝试连接的设备功能齐全 因此问题一定是我的代码 我用BluetoothLeScanner startScan 方法 但回调方法永远不会被调用 public void startSc
  • Android中绑定适配器有什么用?

    我一直在阅读有关Android中绑定适配器的文章 但我似乎不明白它 何时使用绑定适配器 有人可以用一个简单的例子来解释它吗 我读过的一篇文章在主活动中有一个绑定适配器 绑定适配器有一个参数 toastMessage 显然 只要 toastM

随机推荐