ffmpeg - android ndk构建汇编程序消息错误指令

时间:2016-09-16 13:09:49

标签: android ffmpeg android-ndk

我使用以下从Telegram改编的构建脚本编译了最新的ffmpeg源代码:

#!/bin/bash
#apply fix http://permalink.gmane.org/gmane.comp.video.ffmpeg.devel/203198

function build_one {

echo "Cleaning..."
make clean

echo "Configuring..."

./configure \
--cc=$CC \
--nm=$NM \
--enable-stripping \
--arch=$ARCH \
--cpu=$CPU \
--target-os=linux \
--enable-cross-compile \
--yasmexe=$NDK/prebuilt/darwin-x86_64/bin/yasm \
--prefix=$PREFIX \
--enable-pic \
--disable-shared \
--enable-static \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$PLATFORM \
--extra-cflags="-Os -DANDROID $OPTIMIZE_CFLAGS -fPIE -pie --static" \
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl" \
--extra-libs="-lgcc" \
\
--enable-version3 \
--enable-gpl \
\
--disable-doc \
--disable-avx \
\
--disable-everything \
--disable-network \
--disable-zlib \
--disable-debug \
--disable-programs \
--disable-network \
\
--enable-pthreads \
--enable-protocol=file \
--enable-decoder=h264 \
--enable-decoder=gif \
--enable-demuxer=mov \
--enable-demuxer=gif \
--enable-hwaccels \
--enable-runtime-cpudetect \
--enable-asm \
$ADDITIONAL_CONFIGURE_FLAG

#echo "continue?"
#read
make -j8 install

}

NDK=~/Downloads/android-ndk-r12b/

#arm platform
PLATFORM=$NDK/platforms/android-9/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
LD=$PREBUILT/bin/arm-linux-androideabi-ld
AR=$PREBUILT/bin/arm-linux-androideabi-ar
NM=$PREBUILT/bin/arm-linux-androideabi-nm
GCCLIB=$PREBUILT/lib/gcc/arm-linux-androideabi/4.9/libgcc.a
ARCH=arm
CC=$PREBUILT/bin/arm-linux-androideabi-gcc
CROSS_PREFIX=$PREBUILT/bin/arm-linux-androideabi-

#arm v5
CPU=armv5te
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG="--disable-armv6 --disable-armv6t2 --disable-vfp --disable-neon"
build_one

#arm v7n
CPU=armv7-a
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=--enable-neon
build_one

#x86 platform
PLATFORM=$NDK/platforms/android-9/arch-x86
PREBUILT=$NDK/toolchains/x86-4.9/prebuilt/darwin-x86_64
LD=$PREBUILT/bin/i686-linux-android-ld
AR=$PREBUILT/bin/i686-linux-android-ar
NM=$PREBUILT/bin/i686-linux-android-nm
GCCLIB=$PREBUILT/lib/gcc/i686-linux-android/4.9/libgcc.a
ARCH=x86
CC=$PREBUILT/bin/i686-linux-android-gcc
CROSS_PREFIX=$PREBUILT/bin/i686-linux-android-

CPU=i686
OPTIMIZE_CFLAGS="-march=$CPU"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG="--disable-mmx --disable-yasm"
build_one

我将生成的android /文件夹的内容复制到jni / ffmpeg /。 然后我尝试做一个ndk-build,它因错误而失败。

Android.mk文件如下:

LOCAL_PATH := $(call my-dir)

LOCAL_MODULE    := avutil
LOCAL_MODULE_FILENAME := libavutil
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := avformat
LOCAL_MODULE_FILENAME := libavformat
    LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := avcodec
LOCAL_MODULE_FILENAME := libavcodec
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := avdevice
LOCAL_MODULE_FILENAME := libavdevice
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavdevice.a
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE    := avfilter
LOCAL_MODULE_FILENAME := libavfilter
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := postproc
LOCAL_MODULE_FILENAME := libpostproc
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libpostproc.a
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE    := swresample
LOCAL_MODULE_FILENAME := libswresample
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libswresample.a
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE    := swscale
LOCAL_MODULE_FILENAME := libswscale
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false

LOCAL_MODULE    := ffmpeg
LOCAL_CFLAGS    := -w -std=c11 -Os -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS    += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -fno-math-errno
LOCAL_CFLAGS    += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math -D__STDC_CONSTANT_MACROS
LOCAL_CPPFLAGS  := -DBSD=1 -ffast-math -Os -funroll-loops -std=c++11
LOCAL_LDLIBS    := -ljnigraphics -llog -lz -latomic
LOCAL_STATIC_LIBRARIES := avformat avcodec avutil avfilter avdevice postproc swresample swscale
LOCAL_SRC_FILES := ffmpeg.c

include $(BUILD_SHARED_LIBRARY)

抛出的错误是:

  

[armeabi-v7a]编译拇指:ffmpeg< = ffmpeg.c   /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:   汇编程序消息:   /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4421:   错误:错误指令cmovg r3,r8' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4422: Error: bad instruction cmovg r2,r3'   /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4424:   错误:错误指令cmovl r1,r3' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4426: Error: bad instruction cmovg r3,r8'制作:***   [路径/到/应用程序/ OBJ /本地/ armeabi-V7A / OBJ文件/ FFMPEG / ffmpeg.o]   错误1

我猜我在某处弄错了编译器。我正在尝试在Mac上构建。有什么我想念的吗?我正在尝试仅为armeabi-v7a构建。

1 个答案:

答案 0 :(得分:1)

您需要包含本地c文件和Config.h文件

像这样。

LOCAL_PATH := $(call my-dir)

LOCAL_MODULE := libavcodec
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS  += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libavfilter
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS  += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libavformat
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS  += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libavutil
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS  += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libswscale
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS  += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true
LOCAL_LDLIBS  := -llog -landroid -lz -lm
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections -fvisibility=hidden -flto
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_CFLAGS  += -march=armv7-a -mfloat-abi=softfp
LOCAL_STATIC_LIBRARIES := libavfilter libavformat libavcodec libswscale libavutil
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg
LOCAL_C_INCLUDES += ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)-config
LOCAL_SRC_FILES := ffmpeg/ffmpeg.c ffmpeg/cmdutils.c ffmpeg/ffmpeg_filter.c ffmpeg/ffmpeg_opt.c
LOCAL_MODULE := videokit
include $(BUILD_SHARED_LIBRARY)