Android移植lame库(采用CMake)

貌似许多人都是从lame库开始入门Android NDK开发的,在网上一搜一大堆详细教程。本篇的亮点是采用Google推荐的CMake工具(不是ndk-builder)来移植lame项目。重点写一下与ndk-builder的差异,而非教程。

1.CMake是什么?

这个是AndroidStudio 2.2以上的版本才可使用的,跟ndk-builder一样是一款原生构建工具。
与ndk-builder不同的是,ndk-builder需要用到mk文件,而CMake则使用CMakeLists文件。
具体可阅读官方介绍 向您的项目中添加C代码 以及 CMake(不读的话,可能看不懂怎么移植哦)

在这里要说的就是,如果你使用的是AndroidStudio 2.2以上的版本,那么只要在创建项目时选择“Include C++ Support”选项,然后不停点击下一步就可以创建一个使用CMake工具构建C\C++代码的项目。
当然前提是,你在SDK Manager中安装了CMake。

由于本文重点在移植lame项目,对CMake的介绍就不多说了。

2.将lame的代码放入项目

现在假设你已经创建了一个采用CMake的NDK项目,那么你可以找到两个很重要的东西:cpp文件夹和CMakeLists.txt文件。前者是用来放C\C++源码的,后者则是CMake的构建脚本文件。
如果你看完了向您的项目中添加C代码 文章,那你肯定知道CMakeLists.txt脚本中的大体内容了。

好了,先下载lame吧。
http://lame.sourceforge.net/download.php
http://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz
下载完之后解压,然后找到libmp3lame文件夹,将里面的.c和.h文件全部复制到项目的cpp目录中。
注意:libmp3lame文件夹内还包含其他文件夹,不用管它。
然后,再找到include文件夹,将lame.h文件拷贝到cpp目录中。(总共43个文件)

接下来需要将源文件加入到项目中,通过CMakeLists.txt脚本来控制
在CMakeLists中修改add_library 方法的最后一个参数,通过AndroidStudio创建的ndk项目中会有一个native-lib.cpp文件,在此文件后将lame相关的所有.c文件添加进来。这一步是指定源代码的位置。
像下面这样:

add_library(native-lib
             SHARED
             native-lib.cpp bitstream.c encoder.c gain_analysis.c lame.c id3tag.c 
             mpglib_interface.c newmdct.c presets.c psymodel.c quantize.c fft.c
             quantize_pvt.c reservoir.c set_get.c tables.c takehiro.c util.c  
             vbrquantize.c VbrTag.c version.c)

不过,这里要注意,AndroidStudio默认的CMakeLists文件的位置在项目目录中,我将它放到cpp目录中去了。所以才能直接添加.c文件名,否则需要添加相对路径“src/main/cpp/xxx.c”
到此,lame项目就已经被放入我们的ndk项目中了。

3.移植修改

首先,需要对lame中的三个文件进行一些小改动。
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);"

这些跟ndk-builder是一样的,网上有很多教程。

然后,需要修改app -> build.gradle文件

android {
...
    defaultConfig {
    ...
        externalNativeBuild{
            cmake{
                cFlags "-DSTDC_HEADERS"
            }
        }
    }
}

没错,就是添加这个-DSTDC_HEADERS编译标识。

大家可以试一下,如果不加这个标志,我们的项目编译会报错,比如undefined symbol bcopy...之类的。

这里说明一下我的调查结果:
首先,添加-D标志的意思就是给编译器添加宏定义。那么-DSTDC_HEADERS就相当于给项目增加一句”#define STDC_HEADERS“。

我们打开machine.h文件看一下第34行:

#ifdef STDC_HEADERS
# include <stdlib.h>
# include <string.h>
#else
# ifndef HAVE_STRCHR
#  define strchr index
#  define strrchr rindex
# endif
char   *strchr(), *strrchr();
# ifndef HAVE_MEMCPY
#  define memcpy(d, s, n) bcopy ((s), (d), (n))
#  define memmove(d, s, n) bcopy ((s), (d), (n))
# endif
#endif

意思很明白,如果没有定义STDC_HEADERS这个宏则会用到bcopy方法,而这个方法我们根本没有,于是就报错了。

4.测试

到现在我们的移植工作就已经做完了,接下来可以简单测试一下。

打开项目中的native-lib.cpp文件,做如下修改:

#include <jni.h>
#include <string>
#include "lame.h"

extern "C"
jstring
Java_com_javine_mylameproject_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    return env->NewStringUTF(get_lame_version());
}

运行项目,如无意外我们的app会显示lame的版本号 3.99.5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容