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
这样就可以向用其他工具链一样用了
3.下载jrtplib & jthread
http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib
4.在jrtp目录下添加如下内容shell脚本
在jthread 目录下添加以上类似脚本,将jthread相关行删掉即可。
5.开始编译,直接执行两个脚本就行,先编译jthread 再 rtplib
几分钟编译完成,如果有error发生,自己慢慢分析一下cmake 文件吧
6.编译好的lib会自动放到脚本指定的dir下面。
7.收工……
PS: 使用NDK调用编译好的Jrtplib的方法
Android.mk
~~~~~~~~~~
Application.mk
~~~~~~~~~~~~~~
重要补充:
发现这个真不容易啊!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的编译器都是默认使用小端模式,这样修该应该是可以的。
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的编译器都是默认使用小端模式,这样修该应该是可以的。
相关文章推荐
- ubuntu14下编译android jrtplib
- 虚拟机Ubuntu下编译caffe-android-lib
- android librtmp 推送h264流 aac流 基本过程总结二 x264移植
- Ubuntu下移植Tcpdump到Android平台
- ubuntu下android移植ffmpeg0.10
- ubuntu 12.04 NDK + android 4.0.3_r1 编译libffmpeg.so
- Ubuntu 14.04.2 移植FFmpeg 2.8.3 到Android平台
- ubuntu下编译 jrtplib-3.9.1 和 jthread - 1.3.1
- Ubuntu Build libjingle for Android-KeyPoint
- ubuntu下移植ffmpeg到android
- Jthread1.3.1 Jrtplib3.9.1跨平台交叉编译之Android(一)
- ubuntu移植crypto++到Android平台
- [经验技巧] Android移植中部分重要lib库文件作用
- 移植libnfc到Android并结合蓝牙spp操作pn532读卡之概述
- 移植rtmpdump(librtmp)到android
- ubuntu移植libcurl到Android平台
- JRTPLib移植到OMAP3530平台
- Ubuntu 下将ffmpeg移植到Android
- Ubuntu16.04/16.10下Tensorflow demo在Android上的移植
- ffmpeg移植到Android平台为什么用编译libjnivideo.so和libjniaudio.so