您的位置:首页 > 移动开发 > Android开发

JRTPLib 移植到Android - Ubuntu

2012-04-15 13:14 387 查看
1.download NDK first.
2.将NDK 安装到目录中,使ndk成为 STANDALONE COMPILER,如下命令即可,具体可参见android-ndk-r7/docs/STANDALONE-TOOLCHAIN.html

$NDK/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain

这样就可以向用其他工具链一样用了

3.下载jrtplib & jthread

http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib

4.在jrtp目录下添加如下内容shell脚本

#!/bin/sh

export PATH="/media/f12/opt/ndklocal/bin:${PATH}"   #位置请自行修改
PREF="arm-linux-androideabi-"

export CC="${PREF}gcc"
export CXX="${PREF}g++"
export LD="${PREF}ld "
export CPP="${PREF}cpp"
export AS="${PREF}as"
export OBJCOPY="${PREF}objcopy"
export OBJDUMP="${PREF}objdump"
export STRIP="${PREF}strip"
export RANLIB="${PREF}ranlib"
export CCLD="${PREF}gcc"
export AR="${PREF}ar"
OUT_DIR="`pwd`/android-build"

cmake	\
-DCMAKE_SYSTEM_NAME="Generic" \
-DCMAKE_CXX_FLAGS="${C_FLAGS}" \
-DJTHREAD_INCLUDE_DIRS="../jthread/android-build/include/jthread" \   #位置请自行修改
-DJTHREAD_LIBRARIES="../jthread/android-build/lib" \   #位置请自行修改
-DCMAKE_PREFIX_PATH="../jthread/android-build" \   #位置请自行修改
-DCMAKE_INSTALL_PREFIX="${OUT_DIR}" .

make && \
make install

cd ${OUT_DIR}/lib && \
${AR} -x libjrtplib.a && \
${CXX} ${C_FLAGS} -shared -Wl,-soname,libjrtplib.so -o libjrtplib.so  *.obj && \
rm *.obj


在jthread 目录下添加以上类似脚本,将jthread相关行删掉即可。

5.开始编译,直接执行两个脚本就行,先编译jthread 再 rtplib

几分钟编译完成,如果有error发生,自己慢慢分析一下cmake 文件吧

6.编译好的lib会自动放到脚本指定的dir下面。

7.收工……

PS: 使用NDK调用编译好的Jrtplib的方法

Android.mk

~~~~~~~~~~

include $(CLEAR_VARS)
LOCAL_MODULE  := libjthread
LOCAL_SRC_FILES := ./jrtplib/lib/libjthread.a
include $(PREBUILT_STATIC_LIBRARY)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE  := libjrtplib
LOCAL_SRC_FILES := ./jrtplib/lib/libjrtplib.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := jrtptest
LOCAL_SRC_FILES := jrtptest.cpp
LOCAL_STATIC_LIBRARIES := libjrtplib
include $(BUILD_SHARED_LIBRARY)


Application.mk

~~~~~~~~~~~~~~

#对标准C++ stl库的支持
APP_STL := gnustl_static


重要补充:

发现这个真不容易啊!lib移植好后,我写测试程序实现Android与PC通信,但一直都无法收到数据,足足用各种方法调试了三四天才发现这个问题,后来全部改为小端模式编译,就可以了。

CMakeLists.txt会检查编译器支持的大小端模式,使用NDK编译会使用『大端模式』编译(),而与PC上编译采用『小端模式』编译,并会在 rtpconfig.h中添加

#define RTP_BIG_ENDIAN。这会造成PC与anrdoid通信时,出现RTP包头不匹配而丢包的情况。从Code来看,原因为struct RTPHeader& struct RTCPCommonHeader会根据RTP_BIG_ENDIAN大小端模式对RTP头进行不同字节序的封装, 仅此而已。根据x86和android arm的编译器都是默认使用小端模式,这样修该应该是可以的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: