编译libmp3lame到Android
创建一个根目录,随便起个名字。然后里面再创建一个jni目录,必须是这个名字,然后去官网上下载最新版3.99,解压以后把里面的libmp3lame和include目录复制到jni目录下:
![](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3VzZXJpbWFnZTguMzYwZG9jLmNuLzIxLzA3MjUvMTYvNzAxNjEyODRfMjAyMTA3MjUxNjAyMDEwMDk3NjcyNzcyLnBuZw==.jpg)
![](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3VzZXJpbWFnZTguMzYwZG9jLmNuLzIxLzA3MjUvMTYvNzAxNjEyODRfMjAyMTA3MjUxNjAyMjEwOTg4OTkzMzY4LnBuZw==.jpg)
![](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3VzZXJpbWFnZTguMzYwZG9jLmNuLzIxLzA3MjUvMTYvNzAxNjEyODRfMjAyMTA3MjUxNjAyNDUwMTI5MjE2NTU3LnBuZw==.jpg)
然后在jni目录下创建Application.mk和Android.mk。
Application.mk
APP_BUILD_SCRIPT :=$(call my-dir)/Android.mk
APP_PROJECT_PATH :=$(call my-dir)
APP_MODULES:=mp3lame
APP_PLATFORM:=android-21
APP_ABI:=armeabi-v7a arm64-v8a x86_64
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mp3lame
LOCAL_CFLAGS := -DSTDC_HEADERS
LOCAL_SRC_FILES := ./libmp3lame/bitstream.c ./libmp3lame/encoder.c ./libmp3lame/fft.c ./libmp3lame/gain_analysis.c \
./libmp3lame/id3tag.c ./libmp3lame/lame.c ./libmp3lame/mpglib_interface.c ./libmp3lame/newmdct.c \
./libmp3lame/presets.c ./libmp3lame/psymodel.c ./libmp3lame/quantize.c ./libmp3lame/quantize_pvt.c \
./libmp3lame/reservoir.c ./libmp3lame/set_get.c ./libmp3lame/tables.c ./libmp3lame/takehiro.c \
./libmp3lame/util.c ./libmp3lame/vbrquantize.c ./libmp3lame/VbrTag.c ./libmp3lame/version.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libmp3lame $(LOCAL_PATH)/include
ifeq ($(TARGET_ARCH_ABI), armeabi-v7a)
# 采用NEON优化技术
LOCAL_ARM_NEON := true
LOCAL_CFLAGS += -mfpu=neon -mfpu=vfpv3-d16
endif
ifeq ($(TARGET_ARCH_ABI), armeabi)
LOCAL_CFLAGS += -marm -mfpu=vfp -mfpu=vfpv3 -DCMP_HAVE_VFP
endif
include $(BUILD_STATIC_LIBRARY)
此时就算成功运行ndk-build,依然会报另外一个错:
In file included from /Users/zhgeaits/develop/resources/ffmpeg/lame/jni/./libmp3lame/bitstream.c:36:0:
/Users/zhgeaits/develop/resources/ffmpeg/lame/jni/./libmp3lame/util.h:574:12: error: unknown type name 'ieee754_float32_t'
extern ieee754_float32_t fast_log2(ieee754_float32_t x);
^
/Users/zhgeaits/develop/resources/ffmpeg/lame/jni/./libmp3lame/util.h:574:40: error: unknown type name 'ieee754_float32_t'
extern ieee754_float32_t fast_log2(ieee754_float32_t x);
将 util.h 文件的 574 行的”extern ieee754_float32_t fast_log2(ieee754_float32_t x);” 替换为 “extern float fast_log2(float x);”
那是因为android里面不知道ieee754_float32_t是什么,并没有这样的宏定义,我们只要在util.h里面修改为float即可。再次运行ndk-build,就成功了,在obj目录下生产了libmp3lame.a的静态库了。不管是静态库还是动态库都是已经可以在jni里面使用的了。但是要集成到ffmpeg中去,我们还是使用静态库好。
引入到FFMPEG:
--enable-libmp3lame
--enable-encoder=libmp3lame
ARMEABI=armeabi-v7a
LAMEDIR=/Users/zhgeaits/develop/resources/ffmpeg/lame
EXTRA_LDFLAGS="-L$LAMEDIR/obj/local/$ARMEABI"
EXTRA_CFLAGS="-O2 -fpic -I$PLATFORM/usr/include -I$LAMEDIR/jni/libmp3lame -I$LAMEDIR/jni/include $OPTIMIZE_CFLAGS"
注意上面$LAMEDIR/obj/local/$ARMEABI指向的是libmp3lame.a位置。
重新运行脚本会发现报错ERROR: libmp3lame >= 3.98.3 not found,我们去查看config.log会发现:
fatal error: lame/lame.h: No such file or directory
于是在include目录建立lame目录,然后把lame.h复制进去即可。最后就可以编译成功了,注意如果是编译为一个so库,别忘了把libmp3lame.a也要链接进去。
到此直接编译生成的 ffmpeg 的8个so, 就支持了libmp3lame了,只要将 ffmpeg ndk-build 后拷贝到工程就可以使用了。