Android VLC 编译问题

时间:2022-01-31 15:54:47

1 下载代码

git clone git://git.videolan.org/vlc/vlc-android.git

2 编译依赖库

export ANDROID_NDK=/home/hdhuang/Android/android-ndk-r5c/

cd vlc-android/extras/contrib/

./bootstrap -t arm-eabi -d android

提示如下:

[contrib] No install dir specified, using '/home/hdhuang/Android/git/vlc-android/extras/contrib/hosts/arm-eabi'
[contrib] *****************************************************************
[contrib] * If you need contribs with all debug information, run this     *
[contrib] * line and compile the libraries on your own.                   *
[contrib] * CONTRIBS_RELEASE=no ./bootstrap                               *
[contrib] *****************************************************************
[contrib] Using 2 processor(s)

(不懂,不管它。

安装编译需要的工具:)

 sudo apt-get install wget
 sudo apt-get install autoconf
 sudo apt-get install libtool

sudo apt-get install subversion


(subversion 是SVN版本管理里面的一个东西。)

make

(然后就会上网下载需要的依赖库代码)


错误报告:

wget: 无法解析主机地址 “dl.matroska.org”
make[1]: *** [libebml-1.2.0.tar.bz2] 错误 4

make[3]: arm-elf-g++:命令未找到
make[3]: *** [Media.o] 错误 127

libeml库没有下到,arm-elf-g++没有找到。

手动下载。libebml-1.2.0.tar.bz2

make

wget: 无法解析主机地址 “dl.matroska.org”
make[1]: *** [libmatroska-1.1.0.tar.bz2] 错误 4

手动下载libmatroska-1.1.0.tar.bz2

(估计是今天dl.matroska.org有点问题,我昨天链接dl.matroska.org的时候还是没有问题的)

make

make[3]: 正在进入目录 `/home/hdhuang/Android/git/vlc-android/extras/contrib/build-src/live/liveMedia'
arm-elf-g++ -c -Iinclude -I../UsageEnvironment/include -I../groupsock/include -I. -O2 -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -Wall -DBSD=1 Media.cpp

make[3]: arm-elf-g++:命令未找到
make[3]: *** [Media.o] 错误 127

编译 Media.cpp的时候找不到编译器arm-elf-g++。

当然找不到了我用的是arm-linux-g++


查看/build-src 的makefile live部分

ifdef HAVE_ANDROID
    patch -p0 < Patches/live-android.patch
endif


然后查看 live-android.patch

-CROSS_COMPILE?=        arm-elf-
-COMPILE_OPTS =        $(INCLUDES) -I. -O2 -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
+CROSS_COMPILE?=        arm-linux-androideabi-
+COMPILE_OPTS =        $(INCLUDES) -I. -I$(ANDROID_NDK)/platforms/android-9/arch-arm/usr/include -O2 -DLOCALE_NOT_USED -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64


ANDROID的应该是调用下面的配置编译项才对的,怎么调用上面项了呢?

path 是什么?(我是小白来的,不熟悉linux)

path [-p <剥离层级>] < [修补文件] 

diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。

patch A C 就能得到B, 这一步叫做对A打上了B的名字为C的补丁。

之一步之后,你的文件A就变成了文件B。如果你打完补丁之后想恢复到A怎么办呢?

patch -R B C 就可以重新还原到A了。

diff -rc DIR_A DIR_B >C

  这个时候补丁文件C中会记录了原始文件的路径为 DIR_A/A

  现在另一个用户得到了A文件和C文件,其中A文件所在的目录也是DIR_A。 一般,他会比较喜欢在DIR_A目录下面进行patch操作,它会执行

  patch


patch -p0 < Patches/live-android.patch 那这个patch打包到那个文件了呢?

diff -ruN live/config.armlinux live-t/config.armlinux
--- live/config.armlinux    2011-03-15 08:40:37.000000000 +0900
+++ live.new/config.armlinux    2011-03-22 01:41:26.445293024 +0900

打包到config.armlinux文件了。

看了这个文件没有打补丁到这个文件里面。config.mak的配置文件里面有HAVE_ANDROID=1,为什么没有patch文件呢?


touch live
chmod -R u+w live
patch -p0 < Patches/live-uselocale.patch
patching file live/liveMedia/include/Locale.hh
Hunk #1 FAILED at 27.
1 out of 1 hunk FAILED -- saving rejects to file live/liveMedia/include/Locale.hh.rej
patching file live/liveMedia/Locale.cpp
Hunk #1 FAILED at 22.
1 out of 1 hunk FAILED -- saving rejects to file live/liveMedia/Locale.cpp.rej
patching file live/liveMedia/RTSPClient.cpp
Hunk #1 FAILED at 1019.
Hunk #2 FAILED at 1033.
2 out of 2 hunks FAILED -- saving rejects to file live/liveMedia/RTSPClient.cpp.rej
patching file live/liveMedia/RTSPClient.cpp
Hunk #1 FAILED at 935.
1 out of 1 hunk FAILED -- saving rejects to file live/liveMedia/RTSPClient.cpp.rej
patching file live/liveMedia/RTSPCommon.cpp
Hunk #1 FAILED at 137.
1 out of 1 hunk FAILED -- saving rejects to file live/liveMedia/RTSPCommon.cpp.rej

在patching live-uselocale.patch的时候已经出问题的了。所以没有执行后面的代码。

我估计是vlc的版本和live的版本已经不对应的问题导致的了!


奶奶的写好的东西没有了,那就不写那么详细了!大概描述。

我把faplayer的live55版本放过来,就可以编译live库了。

编译taglib的时候,提示cmake 没有权限,cmake 没有安装

sudo apt-get install cmake 一下。


编译完成。


3 编译vlc

cd  ../vlc-android
./bootstrap
mkdir builddir
. cd builddir
. ../extras/package/android/configure.sh

生成编译脚本,


sh $VLC_SOURCEDIR/configure.sh 文件生成配置文件的。

编译,提示liba52 找不到头文件,估计也是版本不对了导致。


我先屏蔽了liba52库先。

--disable-a52  \
                --disable-goom \
                --disable-projectm

. ./compile -k

调用make  file

编译vlc 。

ERROR   : ../../../extras/package/android/../../../modules/audio_filter/converter/dtstofloat32.c:37: 80:  dca.h: No such file or directory

文件有错。

#include <dca.h>                                       /* libdca header file */

在build-src的libdca的include是有dca.h的文件的,只是它找不到了。

MAKE     : audio_filter

DCA_CFLAGS = -I/home/hdhuang/Android/git/vlc-android/extras/contrib/hosts/arm-eabi/include/libdca 

这个目录下面没有libdca的文件。

我把lidbca的include头文件拷贝到libdca目录下。编译成功了。
我从新把a52打开看。

生成编译脚本:

checking a52dec/a52.h usability... no
checking a52dec/a52.h presence... no
checking for a52dec/a52.h... no

configure: error: Could not find liba52 on your system: you may get it from http://liba52.sf.net/. Alternatively you can use --disable-a52 to disable the a52 plugin.


在/hosts/arm-eabi/include/下面有a52dec/a52.h文件,问题怎么说没有呢?

这里检测的路径是哪里的路径呢?

我感觉应该四hosts的路径。

我把checking libswscale/swscale.h usability... no
checking libswscale/swscale.h presence... no
checking for libswscale/swscale.h... no
libswscale 路径下的文件swscale.h拿走,就报这个了。

所以是hosts的路径的。那为什么报不存在呢???

在builddir的目录下面会生成一个config,log的文件记录../extras/package/android/configure.sh脚本的执行情况的。

显示在

configure:35488: checking a52dec/a52.h usability
configure:35488: /home/hdhuang/Android/android-ndk-r5c//toolchains/arm-linux-androideabi-4.4.3/prebuilt/*-x86/bin//arm-linux-androideabi-gcc --sysroot=/home/hdhuang/Android/android-ndk-r5c//platforms/android-9/arch-arm -std=gnu99 -c -O2 -mlong-calls -fstrict-aliasing -fprefetch-loop-arrays -ffast-math -mfpu=neon -mtune=cortex-a8 -ftree-vectorize -mvectorize-with-neon-quad -Wall -Wextra -Wsign-compare -Wundef -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wmissing-prototypes -Wvolatile-register-var -Werror-implicit-function-declaration -I/home/hdhuang/Android/android-ndk-r5c//sources/cxx-stl/gnu-libstdc++/include -I/home/hdhuang/Android/android-ndk-r5c//sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include -DSYS_LINUX -I/usr/include/liveMedia -I/usr/include/groupsock -I/usr/include/BasicUsageEnvironment -I/usr/include/UsageEnvironment   conftest.c >&5
conftest.c:148:24: error: a52dec/a52.h: No such file or directory

# Check whether --with-a52-tree was given.这里出的问题。

do :
  ac_fn_c_check_header_mongrel "$LINENO" "a52dec/a52.h" "ac_cv_header_a52dec_a52_h" "$ac_includes_default"
if test "x$ac_cv_header_a52dec_a52_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_A52DEC_A52_H 1
_ACEOF


然后调用  ac_fn_c_check_header_mongrel 函数

 # Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

那为什么usability是no呢?

不明白啊!


他是执行

$ac_cv_header_a52dec_a52_h这个变量的,然后有问题才去查找是否编译的。

但是这个变量打印不出来。弄不出来,先不能弄这个了!


cd ./vlc-android/extras/package/android
ANDROID_NDK=/home/hdhuang/Android/android-ndk-r5c/
ANDROID_SDK=/home/hdhuang/Android/eclipse/sdk/
VLC_BUILD_DIR=/home/hdhuang/Android/git/vlc-android/builddir/


# Check environment variables
    @if [ -z "$$ANDROID_NDK" -o -z "$$ANDROID_SDK" -o -z "$$VLC_BUILD_DIR" ]; then \
        echo "You must define ANDROID_NDK, ANDROID_SDK and VLC_BUILD_DIR"; \
        exit 1; \
我读定义了环境变量,但是他说我没有定义。

export ANDROID_NDK=/home/hdhuang/Android/android-ndk-r5c/
export  ANDROID_SDK=/home/hdhuang/Android/eclipse/sdk/
export  VLC_BUILD_DIR=/home/hdhuang/Android/git/vlc-android/builddir/

这样的。

make


=== Building libvlcjni ===
make[1]: 正在进入目录 `/home/hdhuang/Android/git/vlc-android/extras/package/android/vlc-android'
SharedLibrary  : libvlcjni.so
/home/hdhuang/Android/android-ndk-r5c/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -logg


    @echo "=== Building libvlcjni ==="
    @cd vlc-android/; \
     $(ANDROID_NDK)/ndk-build

这里出的问题。