android编译lame

2024-01-23 17:40
文章标签 编译 android lame

本文主要是介绍android编译lame,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

android编译lame

编译环境

AndroidStudio2.2,如果没有安装ndk,点开File->Setting,选中AndroidSDK,根据官方文档,勾选中CMake,LLDB和NDK三项安装。

ndk安装

CMake用于使用cmake脚本编译(官方例子采用此方式编译),而我编译选择了采用NDK编译。

编译过程

需要去lame官网去下载lame包,最新版本为3.99.5,新建一个android工程,命名为Mp3LameEncoder,然后在app/src/main文件夹下新建一个jni文件夹,将lame官网下载的压缩包解压,把解压后的libmp3lame复制到jni目录下,同时将include目录下的lame.h也拷贝到jni/libmp3lame目录下,同时删除depcomp、lame.rc、logoe.ico、Makefile.am、Makefile.in、i386文件夹和vector文件夹下的非.h .c文件,这样,前期处理就做好了。

下一步就是要去编写Android.mk文件去编译了,Android.mk文件如下

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LAME_LIBMP3_DIR := libmp3lameLOCAL_MODULE    := mp3lame
LOCAL_SRC_FILES     := \$(LAME_LIBMP3_DIR)/bitstream.c \$(LAME_LIBMP3_DIR)/encoder.c \$(LAME_LIBMP3_DIR)/fft.c \$(LAME_LIBMP3_DIR)/gain_analysis.c \$(LAME_LIBMP3_DIR)/id3tag.c \$(LAME_LIBMP3_DIR)/lame.c \$(LAME_LIBMP3_DIR)/mpglib_interface.c \$(LAME_LIBMP3_DIR)/newmdct.c \$(LAME_LIBMP3_DIR)/presets.c \$(LAME_LIBMP3_DIR)/psymodel.c \$(LAME_LIBMP3_DIR)/quantize.c \$(LAME_LIBMP3_DIR)/quantize_pvt.c \$(LAME_LIBMP3_DIR)/reservoir.c \$(LAME_LIBMP3_DIR)/set_get.c \$(LAME_LIBMP3_DIR)/tables.c \$(LAME_LIBMP3_DIR)/takehiro.c \$(LAME_LIBMP3_DIR)/util.c \$(LAME_LIBMP3_DIR)/vbrquantize.c \$(LAME_LIBMP3_DIR)/VbrTag.c \$(LAME_LIBMP3_DIR)/version.c \LOCAL_LDLIBS := -lloginclude $(BUILD_SHARED_LIBRARY)

编译中的问题

编译中会报各种各样的错误,下面把我遇到的错误及解决方法总结如下:

没有ieee754_float32类型

解决办法: 将util.h的
extern ieee754_float32_t fast_log2(ieee754_float32_t x);
字段改为extern float fast_log2(float x);

提示要将set_get.h文件中的#include
报错undefined reference to ‘bcopy’ undefined reference to ‘index’

error3

解决办法: 这个是最坑爹的,很多文档都没有提到,这里要修改id3tag.c和machine.h,将HAVE_STRCHR和HAVE_MEMCPY的ifdef结构注释掉。

id3tag.c
error3
machine.h
error3

然后在采用ndk-build命令进行编译,就可以顺利完成。

这里也可以在工程项目的build.gradle文件中配置,同时在ModuleSetting中指定NDK路径
gradle编译
然后Build->Make Project就可以自动编译,无需打开命令行窗口敲命令了

这篇关于android编译lame的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637026

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级