从 Roman 的 tutorial 开始。
以下更改适用于 Windows:您应该使用 NDK make.exe,而不是来自 cygwin 的那个。所以,我只是在我的 build_android.sh 中写了d:/dev/Android/ndk/prebuilt/windows-x86_64/bin/make.exe。由于一些奇怪的原因,我无法运行 make clean - 但我只是选择暂时忽略这个问题。
按照教程,别忘了设置
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64
另外,使用混合样式的路径,即 d:/dev/whatever 而不是 cygwin 样式的 /cygdrive/d/dev/whatever。注意不要使用带空格的路径 - 既不是 ndk 安装,也不是 ffmpeg git clone。
使用 ffmpeg 2.2,您可以将 --target-os=android 用于 ./configure,而不是像 步骤 2 中所述修改 ./configure 文件。
在我的机器上,我没有 pr 和 od 命令。我只是选择了伪造他们,写作
echo 'cat $3' > ./pr
echo 'echo od' > ./od
这些不会破坏构建。
所以,我的构建过程如下:
git clean -d -f -x
./configure --enable-shared --disable-static --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-avdevice --disable-doc --disable-symver --cross-prefix=d:/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi- --target-os=android --arch=arm --enable-cross-compile --sysroot=d:/android-ndk-r9c/platforms/android-9/arch-arm/ --extra-cflags="-Os -fpic"
编译确实会显示一些警告,但 .so 文件都已生成。
为了启用 NEON,我使用了
--extra-cflags="-Os -fpic -marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
--extra-ldflags="-Wl,--fix-cortex-a8"
现在,libavcodec.so 无法再构建:链接器列表上有太多文件。 所以,在它崩溃后,我手动启动了链接器:
$ d:/Dev/Android/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64//bin/arm-linux-androideabi-gcc -shared -Wl,-Bsymbolic -Wl,--version-script,libavcodec/libavcodec.ver -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -Wl,--fix-cortex-a8 --sysroot=d:/Dev/Android/ndk/platforms/android-9/arch-arm/ -isysroot d:/Dev/Android/ndk/platforms/android-9/arch-arm/ -Wl,--as-needed -Wl,--warn-common -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample @libavcodec/libavcodec.list -lswresample -lavutil -lm -lz -pthread -o libavcodec/libavcodec.so.55
我对@987654340@文件进行了如下修补:对于$(SUBDIR)$(SLIBNAME_WITH_MAJOR),替换
$$(LD) $(SHFLAGS) $(LDFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS)
与
$(Q)echo >$(SUBDIR)lib$(NAME).list $(wordlist 1,400,$(filter %.o,$$<))
$(Q)echo >>$(SUBDIR)lib$(NAME).list $(wordlist 401,999,$(filter %.o,$$<))
$$(LD) $(SHFLAGS) $(LDFLAGS) $$(LD_O) @$(SUBDIR)lib$(NAME).list $(FFEXTRALIBS)
.. 从那里,make 顺利进行。
PS:我使用make -n libavcodec/libavcodec.so.55 准备响应文件 libavcodec/libavcodec.list。
PPS:这里是another article,它有助于构建和使用适用于 Android 的 ffmpeg。