2016-09-16 121 views
0

我一直在使用改編自電報以下構建腳本編譯最新的ffmpeg來源:的ffmpeg - 安卓NDK編譯彙編的消息壞指令

#!/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 

我複製生成的JNI/ffmpeg的安卓/文件夾的內容/ 。 然後我試圖做一個ndk生成,失敗並出現錯誤。

的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] Compile thumb : ffmpeg <= ffmpeg.c /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s: Assembler messages: /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4421: Error: bad instruction 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: Error: bad instruction cmovl r1,r3' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4426: Error: bad instruction cmovg r3,r8' make: *** [path/to/app/obj/local/armeabi-v7a/objs/ffmpeg/ffmpeg.o] Error 1

我猜我得到了編譯器錯誤的地方。我正在嘗試在Mac上構建。有什麼我失蹤?我正在嘗試構建僅適用於armeabi-v7a。

+0

由於錯誤說這是ffmpeg.c上的失敗,我不認爲這個問題與你的預編譯庫相關。什麼是ffmpeg.c?這是你寫的東西嗎? AFAICT'cmovg'不是ARM指令。 –

+0

不,我沒有寫過ffmpeg.c - 它是FFMPEG源文件中的同一個文件。有什麼我可以用編譯器標誌錯了嗎?我正在使用Mac x86_64 –

回答

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) 
+0

好的!非常感謝 :) –