DVB的项目还是用libdvbpsi舒服些,省得自己去分析那些鸟表,linux平台好些,但在android下,还没弄过,这回就试试。
上vlc网站发现libdvbpsi更新了,现在是1.0.0 pre2版本,看来终于算是正式版了,在ubuntu上先编译了一下,以前那些无聊的warning也没有了,挺好。
下面就往android上挪吧:
1、看了一下我的android平台ndk的编译器是arm-linux-androideabi-gcc,直接configure:
./configure --host=arm-linux-androideabi
报错(oh no!!!!)
configure: error: C compiler cannot create executables
怎么会!查config.log吧,提示:
configure:3173: arm-linux-androideabi-gcc conftest.c >&5
error: cannot open crtbegin_dynamic.o: No such file or directory,
查了一下编译器的目录,有啊,这个文件是存在的,又google一下(这期间绕了许多弯路),原来该编译器需要指定sysroot路径,就是ndk所使用的工具链的路径,于是改成:
./configure --host=arm-linux-androideabi CFLAGS="--sysroot=<YOUR_COMPILER_ROOT>"
configure轻松过了。
2、开始make
make -j 8
哥是8核啊,i7 8核16G啊,编译你还不容易。
我x,报错:
tables/tot.c:78: error: cast increases required alignment of target type
ubuntu没问题啊,都验证过了!
查了一下,跟configure自带的一个flag:Wcast-align有关系,可是为毛这玩意是默认的呢,直接修改Makefile吧
把src/Makefile:128行的-Wcast-align和有同样问题的Wsign-compare去掉,lib编译就没有问题了,example也是有同样的问题,用到再改。
3、集成
make出的libdvbpsi有2个版本,.a的静态库和.so的动态库,我用的是动态库,把libdvbpsi.so*拷贝到ndk能找到的路径下,修改自己的Android.mk
LOCAL_SHARED_LIBRARIES += libdvbpsi
把头文件拷到模块的本地目录,并在Android.mk中增加相应的LOCAL_C_INCLUDES就mm吧。
结果报bool没找到。。。
我搜了一下libdvbpsi的源代码,居然没有bool的定义,按说c是没有bool定义的。
随便打开一个dvbpsi的源文件,原来秘密在于c99增加的<stdbool.h>,这里定义的以前没有的bool类型,太爽了。
4、成功
编译成功后,给dvbpsi注入一个PAT,成功打印如下:
New PAT
transport_stream_id : 35
version_number : 0
| program_number @ [NIT|PMT]_PID
| 5537 @ 0x101 (257)
active : 1