Windows下用ndk编译ffmpeg
第一步:创建一个android工程,然后将ffmpeg整体放到jni下,并创建Android.mk和Application.mk
Android.mk:
{
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#include $(all-subdir-makefiles)
include $(LOCAL_PATH)/ffmpeg/Android.mk
LOCAL_SHORT_COMMANDS :=true
}
Application.mk:
{
# The ARMv7 issignificanly faster due to the use of the hardware FPU
APP_ABI := armeabi-v7a
APP_PLATFORM :=android-9
#APP_MODULES := libffmpeg
APP_BUILD_SCRIPT :=$(call my-dir)/Android.mk
APP_PROJECT_PATH :=$(call my-dir)
APP_SHORT_COMMANDS := true
}
第二步:在ffmpeg下新建一个android_config.sh,然后运行android_config.sh
android_config.sh :
{
#!/bin/bash
E:/research_workspace/FFmpeg/jni/ffmpeg/configure --disable-static --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-doc --enable-ffmpeg --enable-ffplay --enable-ffprobe --enable-ffserver --enable-avdevice --enable-avfilter --enable-postproc --enable-small --cross-prefix=D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi- --enable-cross-compile --target-os=linux --extra-cflags='-ID:/android-ndk-r8e/platforms/android-9/arch-arm/usr/include' --extra-ldflags='-LD:/android-ndk-r8e/platforms/android-9/arch-arm/usr/lib -nostdlib' --arch=arm --disable-symver --disable-debug --disable-stripping
}
第三步:在ffmpeg下添加一个文件av.mk和Android.mk,在libavcodec、libavfilter、libavformat、libavutil、libpostproc和libswscale下添加Android.mk,然后分别修改libavcodec、libswresample 、libavfilter、libavformat、libavutil、libpostproc和libswscale下的Makefile,把include $(SUBDIR)../config.mak屏蔽
Ffmpeg下的Android.mk:
{
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_WHOLE_STATIC_LIBRARIES:= libavformat libavcodec libavutil libpostproc libswresample libswscale
LOCAL_LDLIBS := \
-llog \
-lgcc \
-lz
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
#include$(BUILD_STATIC_LIBRARY)
include $(call all-makefiles-under, $(LOCAL_PATH))
}
Ffmpeg下的av.mk:
{
# LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale
#include$(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include $(LOCAL_PATH)/../config.mak
OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include $(LOCAL_PATH)/Makefile
# collect objects
OBJS-$(HAVE_MMX) +=$(MMX-OBJS-yes)
OBJS += $(OBJS-yes)
FFNAME := lib$(NAME)
FFLIBS := $(foreach, NAME, $(FFLIBS), lib$(NAME))
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare-Wno-switch -Wno-pointer-sign
FFCFLAGS +=-DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"
ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))
ifneq ($(ALL_S_FILES), )
ALL_S_OBJS := $(patsubst %.S, %.o, $(ALL_S_FILES))
C_OBJS := $(filter-out $(ALL_S_OBJS), $(OBJS))
S_OBJS := $(filter $(ALL_S_OBJS), $(OBJS))
else
C_OBJS := $(OBJS)
S_OBJS :=
endif
C_FILES := $(patsubst %.o, %.c, $(C_OBJS))
S_FILES := $(patsubst %.o, %.S, $(S_OBJS))
FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))
}
libavcodec、libswresample下的Android.mk:
{
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES :=$(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS +=$(FFCFLAGS)
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES:= $(FFLIBS)
LOCAL_MODULE :=$(FFNAME)
include $(BUILD_STATIC_LIBRARY)
}
libavformat下的Android.mk:
{
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES :=$(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS +=$(FFCFLAGS)
LOCAL_CFLAGS +=-include "string.h" -Dipv6mr_interface=ipv6mr_ifindex
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES:= $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
}
libavfilter、libavutil、libpostproc和libswscale下的Android.mk内容如下
{
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
}
第四步:
没有找到config.mak, config.h的话,手动从C:\cygwin\home\WIN下拷过来
手动添加 libavutil/ffversion.h #define FFMPEG_VERSION "wr.ndkr8e.ffmpeg281";
没有找到avconfig.h,手动从C:\cygwin\home\WIN\libavutil下拷过来
将libavutil里的libm.h里的static函数注释掉
第五步:
最后运行ndk-build
遇到的问题:
问题1:
{
$ ./android_config.sh
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-gccis unable to create an executable file.
C compiler testfailed.
}
尝试
export TMPDIR="d:/temp"
{
$ /cygdrive/d/ffmpeg-2.8.1/android_config.sh
/cygdrive/d/ffmpeg-2.8.1/android_config.sh:行3:$'\r':未找到命令
.nable to createtemporary file in d:/temp
}
解决:
这个问题是因为cygwin的路径起点与交叉编译工具链的路径起点不一致,需要在configure进行之前将configure内用到的TMPDIR变量设置为cygwin中某个文件夹在windows中的路径。
即:exportTMPDIR=D:/cygwin/tmp或者其它路径。
export TMPDIR=C:/cygwin/temp
{
WIN@WIN70509/cygdrive/d/ffmpeg-2.8.1
$ ./android_config.sh
D:/ffmpeg-2.8.1/configure:line 5743: [: =: unary operator expected
install prefix /usr/local
source path .
C compiler D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-gcc
C library bionic
host C compiler gcc
host C library
ARCH arm (armv5te)
big-endian no
runtime cpudetection yes
ARMv5TE enabled yes
ARMv6 enabled yes
ARMv6T2 enabled yes
VFP enabled yes
NEON enabled yes
THUMB enabled no
debug symbols no
strip symbols no
optimize forsize yes
optimizations yes
static no
shared yes
postprocessingsupport yes
new filtersupport yes
network support yes
threadingsupport no
safe bitstreamreader yes
SDL support no
opencl enabled no
texi2htmlenabled no
perl enabled no
pod2man enabled no
makeinfo enabled no
makeinfo supportsHTML no
Enabled programs:
ffmpeg ffprobe
External libraries:
zlib
Enabled decoders:
aac ayuv frwu
aac_fixed bethsoftvid g2m
aac_latm bfi g723_1
aasc bink g729
ac3 binkaudio_dct gif
ac3_fixed binkaudio_rdft gsm
adpcm_4xm bintext gsm_ms
adpcm_adx bmp h261
adpcm_afc bmv_audio h263
adpcm_ct bmv_video h263i
adpcm_dtk brender_pix h263p
adpcm_ea c93 h264
adpcm_ea_maxis_xa cavs hap
adpcm_ea_r1 ccaption hevc
adpcm_ea_r2 cdgraphics hnm4_video
adpcm_ea_r3 cdxl hq_hqa
adpcm_ea_xas cinepak hqx
adpcm_g722 cljr huffyuv
adpcm_g726 cllc iac
adpcm_g726le comfortnoise idcin
adpcm_ima_amv cook idf
adpcm_ima_apc cpia iff_byterun1
adpcm_ima_dk3 cscd iff_ilbm
adpcm_ima_dk4 cyuv imc
adpcm_ima_ea_eacs dca indeo2
adpcm_ima_ea_sead dds indeo3
adpcm_ima_iss dfa indeo4
adpcm_ima_oki dirac indeo5
adpcm_ima_qt dnxhd interplay_dpcm
adpcm_ima_rad dpx interplay_video
adpcm_ima_smjpeg dsd_lsbf jacosub
adpcm_ima_wav dsd_lsbf_planar jpeg2000
adpcm_ima_ws dsd_msbf jpegls
adpcm_ms dsd_msbf_planar jv
adpcm_sbpro_2 dsicinaudio kgv1
adpcm_sbpro_3 dsicinvideo kmvc
adpcm_sbpro_4 dss_sp lagarith
adpcm_swf dvbsub loco
adpcm_thp dvdsub mace3
adpcm_thp_le dvvideo mace6
adpcm_vima dxa mdec
adpcm_xa dxtory metasound
adpcm_yamaha eac3 microdvd
aic eacmv mimic
alac eamad mjpeg
alias_pix eatgq mjpegb
als eatgv mlp
amrnb eatqi mmvideo
amrwb eightbps motionpixels
amv eightsvx_exp movtext
anm eightsvx_fib mp1
ansi escape124 mp1float
ape escape130 mp2
apng evrc mp2float
ass exr mp3
asv1 ffv1 mp3adu
asv2 ffvhuff mp3adufloat
atrac1 ffwavesynth mp3float
atrac3 fic mp3on4
atrac3p flac mp3on4float
aura flashsv mpc7
aura2 flashsv2 mpc8
avrn flic mpeg1video
avrp flv mpeg2video
avs fourxm mpeg4
avui fraps mpegvideo
mpl2 prores_lgpl tscc2
msa1 ptx tta
msmpeg4v1 qcelp twinvq
msmpeg4v2 qdm2 txd
msmpeg4v3 qdraw ulti
msrle qpeg utvideo
mss1 qtrle v210
mss2 r10k v210x
msvideo1 r210 v308
mszh ra_144 v408
mts2 ra_288 v410
mvc1 ralf vb
mvc2 rawvideo vble
mxpeg realtext vc1
nellymoser rl2 vc1image
nuv roq vcr1
on2avc roq_dpcm vima
opus rpza vmdaudio
paf_audio rv10 vmdvideo
paf_video rv20 vmnc
pam rv30 vorbis
pbm rv40 vp3
pcm_alaw s302m vp5
pcm_bluray sami vp6
pcm_dvd sanm vp6a
pcm_f32be sgi vp6f
pcm_f32le sgirle vp7
pcm_f64be shorten vp8
pcm_f64le sipr vp9
pcm_lxf smackaud vplayer
pcm_mulaw smacker vqa
pcm_s16be smc wavpack
pcm_s16be_planar smvjpeg webp
pcm_s16le snow webvtt
pcm_s16le_planar sol_dpcm wmalossless
pcm_s24be sonic wmapro
pcm_s24daud sp5x wmav1
pcm_s24le srt wmav2
pcm_s24le_planar ssa wmavoice
pcm_s32be stl wmv1
pcm_s32le subrip wmv2
pcm_s32le_planar subviewer wmv3
pcm_s8 subviewer1 wmv3image
pcm_s8_planar sunrast wnv1
pcm_u16be svq1 ws_snd1
pcm_u16le svq3 xan_dpcm
pcm_u24be tak xan_wc3
pcm_u24le targa xan_wc4
pcm_u32be targa_y216 xbin
pcm_u32le tdsc xbm
pcm_u8 text xface
pcm_zork theora xl
pcx thp xsub
pgm tiertexseqvideo xwd
pgmyuv tiff y41p
pgssub tmv yop
pictor truehd yuv4
pjs truemotion1 zero12v
png truemotion2 zerocodec
ppm truespeech zlib
prores tscc zmbv
Enabled encoders:
a64multi jpeg2000 ppm
a64multi5 jpegls prores
aac ljpeg prores_aw
ac3 mjpeg prores_ks
ac3_fixed movtext qtrle
adpcm_adx mp2 r10k
adpcm_g722 mp2fixed r210
adpcm_g726 mpeg1video ra_144
adpcm_ima_qt mpeg2video rawvideo
adpcm_ima_wav mpeg4 roq
adpcm_ms msmpeg4v2 roq_dpcm
adpcm_swf msmpeg4v3 rv10
adpcm_yamaha msvideo1 rv20
alac nellymoser s302m
alias_pix pam sgi
amv pbm snow
apng pcm_alaw sonic
ass pcm_f32be sonic_ls
asv1 pcm_f32le srt
asv2 pcm_f64be ssa
avrp pcm_f64le subrip
avui pcm_mulaw sunrast
ayuv pcm_s16be svq1
bmp pcm_s16be_planar targa
cinepak pcm_s16le tiff
cljr pcm_s16le_planar tta
comfortnoise pcm_s24be utvideo
dca pcm_s24daud v210
dnxhd pcm_s24le v308
dpx pcm_s24le_planar v408
dvbsub pcm_s32be v410
dvdsub pcm_s32le vorbis
dvvideo pcm_s32le_planar wavpack
eac3 pcm_s8 webvtt
ffv1 pcm_s8_planar wmav1
ffvhuff pcm_u16be wmav2
flac pcm_u16le wmv1
flashsv pcm_u24be wmv2
flashsv2 pcm_u24le xbm
flv pcm_u32be xface
g723_1 pcm_u32le xsub
gif pcm_u8 xwd
h261 pcx y41p
h263 pgm yuv4
h263p pgmyuv zlib
huffyuv png zmbv
Enabled hwaccels:
Enabled parsers:
aac dvdsub mpegvideo
aac_latm flac opus
ac3 g729 png
adx gsm pnm
bmp h261 rv30
cavsvideo h263 rv40
cook h264 tak
dca hevc vc1
dirac mjpeg vorbis
dnxhd mlp vp3
dpx mpeg4video vp8
dvbsub mpegaudio vp9
dvd_nav
Enabled demuxers:
aa g723_1 mpjpeg
aac g729 mpl2
ac3 gif mpsub
act gsm msnwc_tcp
adf gxf mtv
adp h261 mv
adx h263 mvi
aea h264 mxf
afc hevc mxg
aiff hls nc
amr hnm nistsphere
anm ico nsv
apc idcin nut
ape idf nuv
apng iff ogg
aqtitle ilbc oma
asf image2 paf
asf_o image2_alias_pix pcm_alaw
ass image2_brender_pix pcm_f32be
ast image2pipe pcm_f32le
au image_bmp_pipe pcm_f64be
avi image_dds_pipe pcm_f64le
avr image_dpx_pipe pcm_mulaw
avs image_exr_pipe pcm_s16be
bethsoftvid image_j2k_pipe pcm_s16le
bfi image_jpeg_pipe pcm_s24be
bfstm image_jpegls_pipe pcm_s24le
bink image_pictor_pipe pcm_s32be
bintext image_png_pipe pcm_s32le
bit image_qdraw_pipe pcm_s8
bmv image_sgi_pipe pcm_u16be
boa image_sunrast_pipe pcm_u16le
brstm image_tiff_pipe pcm_u24be
c93 image_webp_pipe pcm_u24le
caf ingenient pcm_u32be
cavsvideo ipmovie pcm_u32le
cdg ircam pcm_u8
cdxl iss pjs
cine iv8 pmp
concat ivf pva
data jacosub pvf
daud jv qcp
dfa latm r3d
dirac live_flv rawvideo
dnxhd lmlm4 realtext
dsf loas redspark
dsicin lrc rl2
dss lvf rm
dts lxf roq
dtshd m4v rpl
dv matroska rsd
dvbsub mgsts rso
dxa microdvd rtp
ea mjpeg rtsp
ea_cdata mlp sami
eac3 mlv sap
epaf mm sbg
ffm mmf sdp
ffmetadata mov sdr2
filmstrip mp3 segafilm
flac mpc shorten
flic mpc8 siff
flv mpegps sln
fourxm mpegts smacker
frm mpegtsraw smjpeg
g722 mpegvideo smush
sol tmv wav
sox truehd wc3
spdif tta webm_dash_manifest
srt tty webvtt
stl txd wsaud
str vc1 wsvqa
subviewer vc1t wtv
subviewer1 vivo wv
sup vmd xa
swf vobsub xbin
tak voc xmv
tedcaptions vplayer xwma
thp vqf yop
tiertexseq w64 yuv4mpegpipe
Enabled muxers:
a64 ipod pcm_s32be
ac3 ircam pcm_s32le
adts ismv pcm_s8
adx ivf pcm_u16be
aiff jacosub pcm_u16le
amr latm pcm_u24be
apng lrc pcm_u24le
asf m4v pcm_u32be
asf_stream matroska pcm_u32le
ass matroska_audio pcm_u8
ast md5 psp
au microdvd rawvideo
avi mjpeg rm
avm2 mkvtimestamp_v2 roq
bit mlp rso
caf mmf rtp
cavsvideo mov rtp_mpegts
crc mp2 rtsp
dash mp3 sap
data mp4 segment
daud mpeg1system singlejpeg
dirac mpeg1vcd smjpeg
dnxhd mpeg1video smoothstreaming
dts mpeg2dvd sox
dv mpeg2svcd spdif
eac3 mpeg2video spx
f4v mpeg2vob srt
ffm mpegts stream_segment
ffmetadata mpjpeg swf
filmstrip mxf tee
flac mxf_d10 tg2
flv mxf_opatom tgp
framecrc null truehd
framemd5 nut uncodedframecrc
g722 oga vc1
g723_1 ogg vc1t
gif oma voc
gxf opus w64
h261 pcm_alaw wav
h263 pcm_f32be webm
h264 pcm_f32le webm_chunk
hds pcm_f64be webm_dash_manifest
hevc pcm_f64le webp
hls pcm_mulaw webvtt
ico pcm_s16be wtv
ilbc pcm_s16le wv
image2 pcm_s24be yuv4mpegpipe
image2pipe pcm_s24le
Enabled protocols:
cache http rtmpt
concat httpproxy rtp
crypto icecast srtp
data md5 subfile
ffrtmphttp mmsh tcp
file mmst udp
ftp pipe udplite
gopher rtmp unix
hls
Enabled filters:
acrossfade curves mptestsrc
adelay dcshift negate
adrawgraph dctdnoiz noformat
aecho deband noise
aeval decimate null
aevalsrc deflate nullsink
afade dejudder nullsrc
aformat delogo overlay
ainterleave deshake owdenoise
allpass detelecine pad
allrgb dilation palettegen
allyuv drawbox paletteuse
alphaextract drawgraph pan
alphamerge drawgrid perms
amerge earwax perspective
amix ebur128 phase
amovie edgedetect pixdesctest
anull elbg pp
anullsink eq pp7
anullsrc equalizer psnr
apad erosion pullup
aperms extractplanes qp
aphasemeter fade random
aphaser fftfilt removegrain
aresample field removelogo
areverse fieldmatch repeatfields
aselect fieldorder replaygain
asendcmd find_rect reverse
asetnsamples flanger rgbtestsrc
asetpts format rotate
asetrate fps sab
asettb framepack scale
ashowinfo framerate scale2ref
asplit framestep select
astats fspp sendcmd
astreamsync geq separatefields
atadenoise gradfun setdar
atempo haldclut setfield
atrim haldclutsrc setpts
avectorscope hflip setsar
bandpass highpass settb
bandreject histeq showcqt
bass histogram showfreqs
bbox hqdn3d showinfo
biquad hqx showpalette
blackdetect hstack showspectrum
blackframe hue showvolume
blend idet showwaves
boxblur il showwavespic
cellauto inflate shuffleplanes
channelmap interlace sidechaincompress
channelsplit interleave signalstats
chorus join silencedetect
codecview kerndeint silenceremove
color lenscorrection sine
colorbalance life smartblur
colorchannelmixer lowpass smptebars
colorkey lut smptehdbars
colorlevels lut3d split
colormatrix lutrgb spp
compand lutyuv ssim
concat mandelbrot stereo3d
copy mcdeint super2xsai
cover_rect mergeplanes swapuv
crop movie tblend
cropdetect mpdecimate telecine
testsrc unsharp vstack
thumbnail uspp w3fdif
tile vectorscope waveform
tinterlace vflip xbr
transpose vignette yadif
treble volume zoompan
trim volumedetect
Enabled bsfs:
aac_adtstoasc imx_dump_header mpeg4_unpack_bframes
chomp mjpeg2jpeg noise
dump_extradata mjpega_dump_header remove_extradata
h264_mp4toannexb mov2textsub text2movsub
hevc_mp4toannexb mp3_header_decompress
Enabled indevs:
dv1394 lavfi v4l2
fbdev
Enabled outdevs:
fbdev v4l2
License: nonfree andunredistributable
Creating config.mak,config.h, and doc/config.texi...
D:/ffmpeg-2.8.1/configure:line 1316: cmp: command not found
D:/ffmpeg-2.8.1/configure:line 1316: cmp: command not found
WARNING:D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-pkg-confignot found, library detection may fail.
}
问题2:ndk编译时,遇到 make:Nothing to be done for `all'.
通过cmd来尝试
{
C:\Users\WIN>D:\android-ndk-r8e\ndk-build.cmdNDK_PROJECT_PATH=E:\research_works
pace\FFmpeg NDK_APPLICATION_MK=E:\research_workspace\FFmpeg\jni\application.mk
Android NDK: Your APP_BUILD_SCRIPT pointsto an unknown file: Android.mk
D:/android-ndk-r8e/build/core/add-application.mk:165:*** Android NDK: Aborting.
.. . Stop.
}
解决android.mk 小写不行 要大写 Android.mk
问题3:*** Android NDK: Missing LOCAL_MODULE beforeincluding BUILD_STATIC_LIBRARY in jni/ffmpeg/libavcodec/Android.mk
修改av.mk,在前面加上
{
#include$(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include$(LOCAL_PATH)/../config.mak
OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include$(LOCAL_PATH)/Makefile
# collect objects
OBJS-$(HAVE_MMX) +=$(MMX-OBJS-yes)
OBJS += $(OBJS-yes)
}
问题4:*** target file `clean' has both : and ::entries. Stop.
在libavfilter目录中的Makefile的末尾处多了 Clean 这个玩意儿 将其注释掉或者删掉就可以了
问题5:{
"Compile thumb :avformat <= 4xm.c
In file included fromjni/ffmpeg/libavformat/../libavutil/common.h:39:0,
fromjni/ffmpeg/libavformat/../libavutil/avutil.h:288,
fromjni/ffmpeg/libavformat/../libavutil/samplefmt.h:24,
fromjni/ffmpeg/libavformat/../libavcodec/avcodec.h:31,
fromjni/ffmpeg/libavformat/avformat.h:306,
fromjni/ffmpeg/libavformat/4xm.c:32:
D:/android-ndk-r8e/platforms/android-14/arch-arm/usr/include/stdlib.h:54:14:error: expected identifier or '(' before 'void'
D:/android-ndk-r8e/platforms/android-14/arch-arm/usr/include/stdlib.h:54:14:error: expected ')' before numeric constant
make: ***[obj/local/armeabi/objs/avformat/4xm.o] Error 1
}
备注:
由于之前android_config.sh的时候指定了android-9,这里Application.mk也要指定APP_PLATFORM := android-9(注意Application.mk头字母要大写)
非正常解决方法:
自做主张把stdlib.h 中的 extern char *getenv(const char*);改成extern char*_getenv(const char *);
变量名加个下划线,编译完再改回来。
正常解决方法:
将config.h里的#define getenv(x) NULL注释掉
问题6:
{
jni/ffmpeg/libavformat/../libavutil/time_internal.h:26:26:error: static declaration of 'gmtime_r' follows non-static declaration
D:/android-ndk-r8e/platforms/android-9/arch-arm/usr/include/time.h:77:20:note: previous declaration of 'gmtime_r' was here
jni/ffmpeg/libavformat/../libavutil/time_internal.h:37:26:error: static declaration of 'localtime_r' follows non-static declaration
D:/android-ndk-r8e/platforms/android-9/arch-arm/usr/include/time.h:74:20:note: previous declaration of 'localtime_r' was here
}
可以与上面非正常解决方法同样处理
解决:
将config.h里的#define HAVE_GMTIME_R 0改为#define HAVE_GMTIME_R 1 //搜了一下,只有time_internal.h这里用到了HAVE_GMTIME_R
还有config.h里的#define HAVE_LOCALTIME_R 0改为#define HAVE_LOCALTIME_R 1 //搜了一下,只有time_internal.HAVE_LOCALTIME_R
问题7:
{
In file included fromjni/ffmpeg/libavformat/../libavcodec/dca.h:30:0,
fromjni/ffmpeg/libavformat/dtsdec.c:23:
jni/ffmpeg/libavformat/../libavutil/float_dsp.h:148:50:error: expected ';', ',' or ')' before 'v1'
make: ***[obj/local/armeabi/objs/avformat/dtsdec.o] Error 1
}
jni/ffmpeg/libavformat/../libavutil/float_dsp.h:148:50:error: expected ';', ',' or ')' before 'v1'
解决:
c、修改jni/ffmpeg/config.h下的
#define avrestrict restrict为#define restrict
这个应该改为 #define av_restrict
问题8:
{
"Compile thumb :avcodec <= aacdec_fixed.c
C:\Temp\cczAntBF.s:Assembler messages:
C:\Temp\cczAntBF.s:6264:Error: instruction not supported in Thumb16 mode -- `adds ip,r2,r1,lsr#31'
C:\Temp\cczAntBF.s:6265:Error: selected processor does not support Thumb mode `itet ne'
C:\Temp\cczAntBF.s:6266:Error: Thumb does not support conditional execution
C:\Temp\cczAntBF.s:6267:Error: Thumb does not support conditional execution
C:\Temp\cczAntBF.s:6268:Error: Thumb does not support conditional execution
C:\Temp\cczAntBF.s:6307:Error: instruction not supported in Thumb16 mode -- `adds ip,r2,r1,lsr#31'
C:\Temp\cczAntBF.s:6308:Error: selected processor does not support Thumb mode `itet ne'
C:\Temp\cczAntBF.s:6309:Error: Thumb does not support conditional execution
C:\Temp\cczAntBF.s:6310:Error: Thumb does not support conditional execution
C:\Temp\cczAntBF.s:6311:Error: Thumb does not support conditional execution
C:\Temp\cczAntBF.s:13752:Error: selected processor does not support Thumb mode `umull r1,r0,r3,r2'
make: ***[obj/local/armeabi/objs/avcodec/aacdec_fixed.o] Error 1
}
解决:
在Application.mk上加上
APP_ABI := armeabi-v7a
问题9:
{
"Compile thumb :avcodec <= cinepakenc.c
jni/ffmpeg/libavcodec/cinepakenc.c:In function 'rd_strip':
jni/ffmpeg/libavcodec/cinepakenc.c:966:13:error: 'for' loop initial declarations are only allowed in C99 mode
jni/ffmpeg/libavcodec/cinepakenc.c:966:13:note: use option -std=c99 or -std=gnu99 to compile your code
make: ***[obj/local/armeabi-v7a/objs/avcodec/cinepakenc.o] Error 1
}
{
jni/ffmpeg/libavcodec/movtextdec.c:In function 'mov_text_decode_frame':
jni/ffmpeg/libavcodec/movtextdec.c:492:13:error: 'for' loop initial declarations are only allowed in C99 mode
jni/ffmpeg/libavcodec/movtextdec.c:492:13:note: use option -std=c99 or -std=gnu99 to compile your code
make: ***[obj/local/armeabi-v7a/objs/avcodec/movtextdec.o] Error 1
}
解决:将initial放到for之外
问题10:
{
"Compile thumb :avutil <= parseutils.c
In file included fromjni/ffmpeg/libavutil/parseutils.c:33:0:
jni/ffmpeg/libavutil/parseutils.h:186:64:warning: 'struct tm' declared inside parameter list [enabled by default]
jni/ffmpeg/libavutil/parseutils.h:186:64:warning: its scope is only this definition or declaration, which is probablynot what you want [enabled by default]
jni/ffmpeg/libavutil/parseutils.h:191:25:warning: 'struct tm' declared inside parameter list [enabled by default]
jni/ffmpeg/libavutil/parseutils.c:468:64:warning: 'struct tm' declared inside parameter list [enabled by default]
jni/ffmpeg/libavutil/parseutils.c:468:7:error: conflicting types for 'av_small_strptime'
jni/ffmpeg/libavutil/parseutils.h:186:7:note: previous declaration of 'av_small_strptime' was here
jni/ffmpeg/libavutil/parseutils.c:In function 'av_small_strptime':
jni/ffmpeg/libavutil/parseutils.c:490:15:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:496:15:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:502:15:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:508:15:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:514:15:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:520:15:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:At top level:
jni/ffmpeg/libavutil/parseutils.c:539:25:warning: 'struct tm' declared inside parameter list [enabled by default]
jni/ffmpeg/libavutil/parseutils.c:539:8:error: conflicting types for 'av_timegm'
jni/ffmpeg/libavutil/parseutils.h:191:8:note: previous declaration of 'av_timegm' was here
jni/ffmpeg/libavutil/parseutils.c:In function 'av_timegm':
jni/ffmpeg/libavutil/parseutils.c:543:15:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:543:39:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:543:59:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:553:19:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:553:38:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:553:51:error: dereferencing pointer to incomplete type
jni/ffmpeg/libavutil/parseutils.c:In function 'av_parse_time':
jni/ffmpeg/libavutil/parseutils.c:563:12:error: variable 'dt' has initializer but incomplete type
jni/ffmpeg/libavutil/parseutils.c:563:12:warning: excess elements in struct initializer [enabled by default]
jni/ffmpeg/libavutil/parseutils.c:563:12:warning: (near initialization for 'dt') [enabled by default]
jni/ffmpeg/libavutil/parseutils.c:563:15:error: storage size of 'dt' isn't known
jni/ffmpeg/libavutil/parseutils.c:563:27:error: storage size of 'tmbuf' isn't known
jni/ffmpeg/libavutil/parseutils.c:658:20:error: variable 'dt2' has initializer but incomplete type
jni/ffmpeg/libavutil/parseutils.c:658:23:error: storage size of 'dt2' isn't known
make: ***[obj/local/armeabi-v7a/objs/avutil/parseutils.o] Error 1
}
头文件冲突
解决:
把ffmpeg/libavutil/time.h更名为avtime.h,
同时修改下面文件中的引用libavutil/time.h为libavutil/avtime.h
ffmpeg/libavformat/avformat.h:211
ffmpeg/libavformat/avio.c:25
ffmpeg/libavformat/hls.c:33
ffmpeg/libavformat/hlsproto.c:29
ffmpeg/libavformat/mux.c:39:30
ffmpeg/libavformat/utils.c:40
ffmpeg/libavutil/time.c:36
搜索libavutil/time.h,把它们全部改为libavutil/avtime.h
libavutil/avtime.h 里添加 #include <time.h>
问题11:编译出来ffmpeg.so太小
解决:将Android.mk里的LOCAL_STATIC_LIBRARIES替换为LOCAL_WHOLE_STATIC_LIBRARIES
问题12:
{
SharedLibrary : libffmpeg.so
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:error: ./obj/local/armeabi-v7a/libavcodec.a(golomb.o): multiple definition of'ff_interleaved_dirac_golomb_vlc_code'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavformat.a(golomb_tab.o): previous definition here
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:error: ./obj/local/armeabi-v7a/libavcodec.a(golomb.o): multiple definition of'ff_interleaved_se_golomb_vlc_code'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavformat.a(golomb_tab.o): previous definition here
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:error: ./obj/local/armeabi-v7a/libavcodec.a(golomb.o): multiple definition of'ff_interleaved_ue_golomb_vlc_code'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavformat.a(golomb_tab.o): previous definition here
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:error: ./obj/local/armeabi-v7a/libavcodec.a(golomb.o): multiple definition of'ff_interleaved_golomb_vlc_len'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavformat.a(golomb_tab.o): previous definition here
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:error: ./obj/local/armeabi-v7a/libavcodec.a(golomb.o): multiple definition of'ff_ue_golomb_len'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavformat.a(golomb_tab.o): previous definition here
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:error: ./obj/local/armeabi-v7a/libavcodec.a(golomb.o): multiple definition of'ff_se_golomb_vlc_code'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavformat.a(golomb_tab.o): previous definition here
此处忽略许多…
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavcodec.a(vp8dsp.o): in functionff_vp78dsp_init:jni/ffmpeg/libavcodec/vp8dsp.c:675: error: undefined referenceto 'ff_vp78dsp_init_arm'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavcodec.a(vp8dsp.o): in functionff_vp8dsp_init:jni/ffmpeg/libavcodec/vp8dsp.c:735: error: undefined referenceto 'ff_vp8dsp_init_arm'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavcodec.a(zmbvenc.o): in functionencode_frame:jni/ffmpeg/libavcodec/zmbvenc.c:219: error: undefined reference to'deflateReset'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavutil.a(cpu.o): in function av_get_cpu_flags:jni/ffmpeg/libavutil/cpu.c:84:error: undefined reference to 'ff_get_cpu_flags_arm'
D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:./obj/local/armeabi-v7a/libavutil.a(float_dsp.o): in functionavpriv_float_dsp_init:jni/ffmpeg/libavutil/float_dsp.c:134: error: undefinedreference to 'ff_float_dsp_init_arm'
collect2: ld returned1 exit status
make: ***[obj/local/armeabi-v7a/libffmpeg.so] Error 1
}
解决:
子问题1、libavcodec/log2_tab.o: multiple definition of'ff_log2_tab'解决办法
{
新增文件libavutil/log2_tab.h, 其内容如下
#ifndef AV_LOG2TAB_H
#define AV_LOG2TAB_H
#include <stdint.h>
extern const uint8_t ff_log2_tab[256];
#endif
将所有报上述类似错误的, 做如下修改
如:修改 libavcodec/log2_tab.c,将log2_tab.c改为log2_tab.h
// #include"libavutil/log2_tab.c"
#include "libavutil/log2_tab.h"
}
子问题2、error: libavformat/golomb_tab.o: multipledefinition of 'ff_interleaved_dirac_golomb_vlc_code'解决方法
{
修改libavformat/golomb_tab.c, 如下:
// #include "libavcodec/golomb.c"
#include "libavcodec/golomb.h"
}
子问题3、obj/local/armeabi-v7a/libavutil.a(reverse.o):multiple definition of 'ff_reverse'
/obj/local/armeabi-v7a/libavcodec.a(reverse.o):previous definition here 解决方法
{
新增文件libavutil/reverse.h, 其内容如下
#ifndef AV_REVERSE_WR_H
#define AV_REVERSE_WR_H
#include <stdint.h>
extern const uint8_t ff_reverse[256];
#endif //AV_REVERSE_WR_H
将所有报上述类似错误的, 做如下修改
如:修改libavutil/reverse.c, reverse.reverse.h
// #include "libavutil/reverse.c"
#include "libavutil/reverse.h"
}
子问题4、error: undefined reference to 'inflateEnd'
{缺少zlib
在Android.mk上加上
LOCAL_LDLIBS := \
-llog \
-lgcc \
-lz
}
子问题5、error: undefined reference to'ff_ac3dsp_init_arm'
{
解决方法:
{
/libffmpeg/libavcodec/arm/目录下 找 Makefile和ac3dsp_init_arm.c 定义都在这
将av.mk单独拷一份到/libffmpeg/libavcodec下,libavcodec的Android.mk里指向这个av.mk,在里面加上include$(LOCAL_PATH)/arm/Makefile
{
衍生问题:
{
StaticLibrary :libavcodec.a
process_begin:CreateProcess(D:\android-ndk-r8e\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ar.exe,D:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/arm-linux-androideabi-ar
此处忽略许多…
./obj/local/armeabi-v7a/objs/avcodec/xwdenc.o./obj/local/armeabi-v7a/objs/avcodec/xxan.o./obj/local/armeabi-v7a/objs/avcodec/y41pdec.o./obj/local/armeabi-v7a/objs/avcodec/y41penc.o./obj/local/armeabi-v7a/objs/avcodec/yop.o./obj/local/armeabi-v7a/objs/avcodec/yuv4dec.o./obj/local/armeabi-v7a/objs/avcodec/yuv4enc.o ./obj/local/armeabi-v7a/objs/avcodec/zerocodec.o./obj/local/armeabi-v7a/objs/avcodec/zmbv.o./obj/local/armeabi-v7a/objs/avcodec/zmbvenc.o, ...) failed.
make (e=87): 参数错误。
}
原因是.MK文件中包含的文件太多了,而windows对于函数参数个数有限制
在Android.mk文件中添加:LOCAL_SHORT_COMMANDS := true
在Application.mk文件中添加:APP_SHORT_COMMANDS := true
http://stackoverflow.com/questions/12598933/ndk-build-createprocess-make-e-87-the-parameter-is-incorrect
问题:有更多的连接问题
未解决break
}
}
换个解决方法:将undefined reference的全部加上WR_IGNORE忽略,在config.h上加上#define WR_IGNORE 0
}
子问题6、error: undefined reference to 'swr_close'
{
缺少libswresample
android.mk里加上 libswresample,libswresample用libavcodec的Android.mk
{
衍生问题:audioconvert.c:158: error:undefined reference to 'swri_audio_convert_init_arm'
解决:加上WR_IGNORE忽略
}
}
终于成功了,下一步试试调用看看能不能用
可以~