Android移植librtmp

一、前言
为了让android能够使用librtmp,我们需要下载它的源码并使用交叉编译工具编译成可以供android使用的库文件。我在网上参考了一些别人移植的文章,但到自己移植的时候缺踩了许多坑。还好今天终于移植成功了,特此总结一下。
二、流程
我看了一下网上的资料大概流程都是:
1、从ndk中提出一个交叉编译工具链,并设置环境变量,供我们编译使用。
2、因为librtmp需要依赖ssl library,所有我们首先需要下载,并交叉编译ssl,
3、交叉编译ssl library(我选择的是 polarssl-1.2.17)
4、开始交叉编译librtmp,需要引用polarssl。

下面我贴出这种编译的详细流程:
1、提出交叉编译工具链

ndk-bundle/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --platform=android-14 --install-dir=/home/blueberry/developer/android_tools/armeabi-4.9

最后这个工具集就会在 /home/blueberry/developer/android_tools/armeabi-4.9这个文件加下
然后我们设置环境变量:

vim /etc/profile export PATH=/home/blueberry/developer/android_tools/armeabi-4.9/bin:$PATH

后运行source /etc/profile

2、下载编译polarssl
然后我们下载polarssl-1.2.14版本(最好是这个版本)
地址:https://tls.mbed.org/tech-updates/releases/polarssl-1.2.14-released
下载完成之后解压到本地。编译前将include/polarssl/config.h中的
 #define POLARSSL_HAVEGE_C的注释去掉,否则编译librtmp的时候会出现 undefined reference tohavege_random’`错误,这里是因为polarssl默认关闭了havege模块。

3、然后编译:

make CC=arm-linux-androideabi-gcc APPS= make install DESTDIR=/home/blueberry/developer/android_tools/armeabi-4.9/sysroot

编译好之后,这个库的头文件和库就会存放在 /home/blueberry/developer/android_tools/armeabi-4.9/sysroot 这个目录下了。

4、接下来就是编译librtmp了
如果需要动态库,则执行:

make SYS=android CROSS_COMPILE=arm-linux-androideabi- INC="-I/home/blueberry/developer/android_tools/armeabi-4.9/sysroot/include" CRYPTO=POLARSSL

编译静态库则需要执行:

~/developer/osl/librtmp/rtmpdump$ make SYS=android CROSS_COMPILE=arm-linux-androideabi- INC="-I/home/blueberry/developer/android_tools/armeabi-4.9/sysroot/include" CRYPTO=POLARSSL SHARED=

上述就是我按着网上的方法所做的。应该没有差错,但事实不尽人意啊!我在编译动态库的时候遇到了这个错误:

home/blueberry/developer/android_tools/armeabi-4.9/bin/../sysroot/usr/lib/crtbegin_dynamic.o:crtbrand.c:function _start: error: undefined reference to 'main'
collect2: error: ld returned 1 exit status
make[1]: *** [librtmp] Error 1
make[1]: Leaving directory `/home/blueberry/developer/osl/librtmp/rtmpdump/librtmp'

我在网上搜索,说解决这种错误的方法就是加入-shared选项,我搞了半天也没搞成功。

然后我 继续编译静态库结果编译出了librtmp.a但是这个库我在用的时候发现缺少很多函数。

总之,我可能和网上作者使用的库的版本不同,所以会到这些错误。

三、编写Android.mk来编译librtmp

哎、既然上面的方法失败了,就用另一个方法。即使我们来编写Android.mk来编译librtmp
我们需要编写 2个Android.mk文件、1个Application.mk文件
1、Android.mk

LOCAL_PATH := $(call my-dir)

subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
        librtmp \
   ))

SSL := /home/blueberry/developer/android_tools/armeabi-4.9/sysroot
ifndef SSL
 $(error "You must define SSL before starting")
endif

include $(subdirs)                              

2、librtmp/Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := polarssl
LOCAL_EXPORT_C_INCLUDES := $(SSL)/include
LOCAL_SRC_FILES := $(SSL)/lib/libpolarssl.a

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(NDK_PROJECT_PATH)/librtmp \
    $(SSL)/include

LOCAL_SRC_FILES:= \
    amf.c \
   hashswf.c \
   log.c \
   parseurl.c \
   rtmp.c

LOCAL_STATIC_LIBRARIES = polarssl
LOCAL_CFLAGS += -I$(SSL)/include -DUSE_POLARSSL
LOCAL_LDLIBS += -L$(SSL)/lib -L$(SSL)/usr/lib
LOCAL_LDLIBS += -lz

LOCAL_MODULE := librtmp

include $(BUILD_SHARED_LIBRARY)

3、新建jni目录,创建Application.mk
jni/Application.mk

NDK_TOOLCHAIN_VERSION := 4.9
APP_PLATFORM := android-21
APP_CPPFLAGS += -DANDROID
APP_ABI := armeabi-v7a
APP_PROJECT_PATH := $(shell pwd)
APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk

4、最后就是使用 ndk-build来编译了。
我们也可以写一个脚本:
build.sh

NDK=/home/blueberry/developer/Sdk/ndk-bundle
$NDK/ndk-build NDK_APPLICATION_MK=./jni/Application.mk NDK_PROJECT_PATH=./

5、最后我们执行,
在libs文件下就会有我们编译出的 动态库了。

提示:大家在使用的时候要注意路径。

我编译好的动态库以及mk文件下载地址:http://download.csdn.net/detail/a992036795/9735901 其中libs下存放的编译好的动态库。大家用的时候只需要将需要用到的头文件和动态库考出就好。

我移植好的额polarssl的静态库即polarssl源码下载地址:http://download.csdn.net/detail/a992036795/9811299

参考:http://www.07net01.com/2015/07/886927.html
http://hamer-blog.logdown.com/posts/600798

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值