分享

编译libmp3lame到Android

 狄伦视角 2021-07-25

创建一个根目录,随便起个名字。然后里面再创建一个jni目录,必须是这个名字,然后去官网上下载最新版3.99,解压以后把里面的libmp3lame和include目录复制到jni目录下:

  

  

  

然后在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 后拷贝到工程就可以使用了。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多