jrtplib库移植到android上

由于工作中需要用到rtp协议,java暂时没有比较好的开发框架,参考了其他的一些博文,自己摸索着编译了jrtplib库,在此记录一下。

编译环境:
Ubuntu14.2

准备工作:
1、安装NDK;
2、安装CMake。
linux下安装cmake,可执行sudo apt-get install cmake安装。
(可参考cmake升级

编译步骤:

  1. 下载相关lib库,本文使用jrtplib-3.11.1和jthread-1.3.3(注:jrtplib引用了jthread的线程,所以要使用jthread库)jthread
  2. 编译jthread
    ①解压文件(#tar -xvf *.tar.gz)
    ②新建一个android.sh文件(#touch 文件名)
    ③编辑内容(vim 文件名)。注意修改ndk路径为自己本地路径,同时注意版本号(4.9,android-14等,本地是否存在)
#!/bin/sh
# 
# 
# Builds the JThread library for Android
# 清空上次的编译
make clean
#你自己的NDK路径。
export NDK_ROOT="/home/dev/android-ndk-r14b"
export PATH="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/:${PATH}"
# 设置你的android平台编译器的版本 这里采用Android4.0 
export SYS_ROOT=${NDK_ROOT}/platforms/android-14/arch-arm/
#编译使用的toolchain
export TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
# 这个是输出的路径
PREF="arm-linux-androideabi-"

OUT_DIR="`pwd`/android-build"
C_FLAGS="-lstdc++ -lsupc++ \
        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/include \
        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include \
        -L${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi"

#set -e

export CC="${TOOLCHAIN}/bin/${PREF}gcc  --sysroot=${SYS_ROOT}"
export CXX="${TOOLCHAIN}/bin/${PREF}g++  --sysroot=${SYS_ROOT}"
export LD="$${TOOLCHAIN}/bin/{PREF}ld  --sysroot=${SYS_ROOT}"
export CPP="${TOOLCHAIN}/bin/${PREF}cpp  --sysroot=${SYS_ROOT}"
export AS="${TOOLCHAIN}/bin/${PREF}as"
export OBJCOPY="${TOOLCHAIN}/bin/${PREF}objcopy"
export OBJDUMP="${TOOLCHAIN}/bin/${PREF}objdump"
export STRIP="${TOOLCHAIN}/bin/${PREF}strip"
export RANLIB="${TOOLCHAIN}/bin/${PREF}ranlib"
export CCLD="${TOOLCHAIN}/bin/${PREF}gcc  --sysroot=${SYS_ROOT}"
export AR="${TOOLCHAIN}/bin/${PREF}ar"

cmake   \
                -DCMAKE_SYSTEM_NAME="Generic" \
        -DCMAKE_CXX_FLAGS="${C_FLAGS}"\
                -DCMAKE_FIND_ROOT_PATH="${SYS_ROOT}" \
                -DCMAKE_INSTALL_PREFIX="${OUT_DIR}" . && \

make && \
make install

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

exit 0

④src/pthread/jthread.cpp的130行,找到pthread_cancel(threadid);并注释之,替换成 pthread_kill(threadid, SIGUSR1);
⑤打开CMakeLists.txt,注释掉这一段:

# find_package(Threads)
# if (NOT CMAKE_USE_WIN32_THREADS_INIT)
# 	if (NOT CMAKE_USE_PTHREADS_INIT)
# 		message(FATAL_ERROR "Can find neither pthread support nor Win32 thread support")
# 	endif (NOT CMAKE_USE_PTHREADS_INIT)
# endif (NOT CMAKE_USE_WIN32_THREADS_INIT)

⑥给android.sh文件授权(chmod a+x 文件名)
⑦命令行执行android.sh脚本(./android.sh)即可在当前目录的android-build目录下得到相关头文件和库。

  1. 编译jrtplib库
    ①步骤同编译jthread,解压文件、新建执行文件,写入内容;
    ②注意android.sh内容:
    需要增加jthread的支持,以及libjrtp.a(低版本编译用到的是libjrtplib.a)
#!/bin/sh
# 
# 
# Builds the JRTPLib library for Android
make clean
#你自己的NDK路径。
export NDK_ROOT="/home/dev/android-ndk-r14b"
export PATH="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/:${PATH}"
# 设置你的android平台编译器的版本 这里采用Android4.0 
export SYS_ROOT=${NDK_ROOT}/platforms/android-9/arch-arm/
#编译使用的toolchain
export TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
# 这个是输出的路径
PREF="arm-linux-androideabi-"

OUT_DIR="`pwd`/android-build"

C_FLAGS="       -lc \
                        -lgcc \
                        -lstdc++ -lsupc++ \
                        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/include \
                        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include \
                        -L../jthread-1.3.3/android-build/lib  \
                        -L${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi"

#set -e

export CC="${TOOLCHAIN}/bin/${PREF}gcc  --sysroot=${SYS_ROOT}"
export CXX="${TOOLCHAIN}/bin/${PREF}g++  --sysroot=${SYS_ROOT}"
export LD="$${TOOLCHAIN}/bin/{PREF}ld  --sysroot=${SYS_ROOT}"
export CPP="${TOOLCHAIN}/bin/${PREF}cpp  --sysroot=${SYS_ROOT}"
export AS="${TOOLCHAIN}/bin/${PREF}as"
export OBJCOPY="${TOOLCHAIN}/bin/${PREF}objcopy"
export OBJDUMP="${TOOLCHAIN}/bin/${PREF}objdump"
export STRIP="${TOOLCHAIN}/bin/${PREF}strip"
export RANLIB="${TOOLCHAIN}/bin/${PREF}ranlib"
export CCLD="${TOOLCHAIN}/bin/${PREF}gcc  --sysroot=${SYS_ROOT}"
export AR="${TOOLCHAIN}/bin/${PREF}ar"

cmake   \
                -DCMAKE_SYSTEM_NAME="Generic" \
                -DCMAKE_CXX_FLAGS="${C_FLAGS}" \
                -DCMAKE_FIND_ROOT_PATH="${SYS_ROOT}" \
                -DJTHREAD_INCLUDE_DIRS="../jthread-1.3.3/android-build/include" \
                -DJTHREAD_LIBRARIES="../jthread-1.3.3/android-build/lib" \
                -DCMAKE_PREFIX_PATH="../jthread-1.3.3/android-build" \
                -DCMAKE_INSTALL_PREFIX="${OUT_DIR}" .

make && \
make install

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

exit 0

③打开CMakeLists.txt,找到并注释掉: add_subdirectory(examples)
④编译运行

  1. 最后生成的动态和静态链接库文件就可以用到android项目里面做开发了。

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 := stlport_static
APP_STL := gnustl_static
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值