創(chuàng)建一個根目錄,隨便起個名字。然后里面再創(chuàng)建一個jni目錄,必須是這個名字,然后去官網(wǎng)上下載最新版3.99,解壓以后把里面的libmp3lame和include目錄復制到jni目錄下: ![]()
![]()
![]()
然后在jni目錄下創(chuàng)建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優(yōu)化技術(shù) 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目錄下生產(chǎn)了libmp3lame.a的靜態(tài)庫了。不管是靜態(tài)庫還是動態(tài)庫都是已經(jīng)可以在jni里面使用的了。但是要集成到ffmpeg中去,我們還是使用靜態(tài)庫好。 引入到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位置。 重新運行腳本會發(fā)現(xiàn)報錯ERROR: libmp3lame >= 3.98.3 not found,我們?nèi)ゲ榭碿onfig.log會發(fā)現(xiàn): fatal error: lame/lame.h: No such file or directory 于是在include目錄建立lame目錄,然后把lame.h復制進去即可。最后就可以編譯成功了,注意如果是編譯為一個so庫,別忘了把libmp3lame.a也要鏈接進去。 到此直接編譯生成的 ffmpeg 的8個so, 就支持了libmp3lame了,只要將 ffmpeg ndk-build 后拷貝到工程就可以使用了。 |
|