Jthread1.3.1 Jrtplib3.9.1跨平台交叉编译之Android(一)

来源:互联网 发布:淘宝改销量技术 编辑:程序博客网 时间:2024/06/04 20:05

折腾two days终于编译OK,主要参考http://blog.csdn.net/nickwar/article/details/9133399 https://github.com/jimjh/JRTPLib-for-Android,资源且少,越发珍贵,做一记录。

1.平台

win7 ndk-r8d cmake2.8   msys1.0

cmake用法百度

2.下载源码解压

!!!.注意目录和子目录均有CmakeLIst,两文件内容不同,位置不要乱动。

先说Jthread编译,src目录下有源码和头文件(编译时遇到最多的错误就是找不见头文件,或者头文件顺序不当引起的诡异error)

在jthread目录下:

1 打开CmakeList文件

注释这些,其实不注释也可以,暂且这么做

# 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)
2 在jthread下新建一个android-build目录以放置生成好的库及头文件

src/pthread/jthread.cpp的125行,找到pthread_cancel(threadid);并注释之,替换成 pthread_kill(threadid, SIGUSR1); 原因么,是因为android用的自家产的Bionic libc而不是标准glibc,具体可wikipedia之。

4,最重要的android.sh,就在jthread的下创建

<span style="color:#222222;">#!/bin/sh# Written by Nxf <nick.xf@gmail.com># # Builds the JThread library for Androidexport NDK_ROOT="D:/android-ndk-r8d-windows/android-ndk-r8d"     </span><span style="color:#ff0000;">改成自己路径</span><span style="color:#222222;">export PATH="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/:${PATH}"SYS_ROOT="${NDK_ROOT}/platforms/android-14/arch-arm"PREF="arm-linux-androideabi-"OUT_DIR="D:/sh/jthread/android-build"   C_FLAGS="-lstdc++ -lsupc++ \        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/include \        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi/include \        -L${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi"#set -eexport CC="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}gcc  --sysroot=${SYS_ROOT}"export CXX="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}g++  --sysroot=${SYS_ROOT}"export LD="$${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/{PREF}ld  --sysroot=${SYS_ROOT}"export CPP="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}cpp  --sysroot=${SYS_ROOT}"export AS="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}as"export OBJCOPY="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}objcopy"export OBJDUMP="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}objdump"export STRIP="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}strip"export RANLIB="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}ranlib"export CCLD="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}gcc  --sysroot=${SYS_ROOT}"export AR="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}ar"cmake\-DCMAKE_SYSTEM_NAME="Generic" \        -DCMAKE_CXX_FLAGS="${C_FLAGS}"\-DCMAKE_FIND_ROOT_PATH="${SYS_ROOT}" \-DCMAKE_INSTALL_PREFIX="${OUT_DIR}" \-G "MSYS Makefiles" ./D/android-ndk-r8d-windows/android-ndk-r8d/prebuilt/windows/bin/make.exe   </span><span style="color: rgb(34, 34, 34); font-family: SimSun;"> </span><span style="font-family: SimSun; color: rgb(255, 0, 0);">改成自己路径</span><span style="color:#222222;">/D/android-ndk-r8d-windows/android-ndk-r8d/prebuilt/windows/bin/make.exe installcd ${OUT_DIR}/lib && \${AR} -x libjthread.a && \${CXX} ${C_FLAGS} -shared -Wl,-soname,libjthread.so -o libjthread.so  *.obj && \rm *.objexit 0</span>
5.在msys中,cd的当前路径,运行./android.sh 

libjthread.a 和.so文件生成,还算比较顺利。


下面开始jrtplib

步骤基本同前,知识改文件稍多

1.修改Cmakelist,传输中的大小端问题,也可以不该,为什么?细心的读者会发现有个 rtpconfig.h.in,此非头文件,内容却像,稍后再说。

if (CMAKE_CROSSCOMPILING)# option (JRTPLIB_USE_BIGENDIAN "Target platform is big endian" ON)# if (JRTPLIB_USE_BIGENDIAN)# set(RTP_ENDIAN "#define RTP_BIG_ENDIAN")# else (JRTPLIB_USE_BIGENDIAN)set(RTP_ENDIAN "// Little endian system")# endif (JRTPLIB_USE_BIGENDIAN)else (CMAKE_CROSSCOMPILING)# test_big_endian(JRTPLIB_BIGENDIAN)# if (JRTPLIB_BIGENDIAN)# set(RTP_ENDIAN "#define RTP_BIG_ENDIAN")# else (JRTPLIB_BIGENDIAN)set(RTP_ENDIAN "// Little endian system")# endif (JRTPLIB_BIGENDIAN)endif (CMAKE_CROSSCOMPILING)
2.android.sh

#!/bin/sh# # Builds the JThread library for Androidexport NDK_ROOT="D:/android-ndk-r8d-windows/android-ndk-r8d"export PATH="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/:${PATH}"SYS_ROOT="${NDK_ROOT}/platforms/android-14/arch-arm"PREF="arm-linux-androideabi-"J="D:/rtp/jthread/src"OUT_DIR="D:/rtp/jrtplib/android-build"#C_FLAGS="-lstdc++ -lsupc++ \#        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/include \#        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi/include \#        -L${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi"#        -L${J} "C_FLAGS="-lstdc++ -lsupc++ \ <span style="color:#ff0000;">原作上面两个参数去掉,编译不碍</span>        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/include \        -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi/include \        -L${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi \-L${J}"#set -eexport CC="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}gcc  --sysroot=${SYS_ROOT}"export CXX="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}g++  --sysroot=${SYS_ROOT}"export LD="$${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/{PREF}ld  --sysroot=${SYS_ROOT}"export CPP="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}cpp  --sysroot=${SYS_ROOT}"export AS="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}as"export OBJCOPY="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}objcopy"export OBJDUMP="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}objdump"export STRIP="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}strip"export RANLIB="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}ranlib"export CCLD="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}gcc  --sysroot=${SYS_ROOT}"export AR="${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/${PREF}ar"cmake\-DCMAKE_SYSTEM_NAME="Generic" \        -DCMAKE_CXX_FLAGS="${C_FLAGS}"\-DCMAKE_FIND_ROOT_PATH="${SYS_ROOT}" \-DJTHREAD_INCLUDE_DIRS="${J}" \<span style="color:#ff0000;">    改这行及下面</span>        -DJTHREAD_LIBRARIES="${J}" \        -DCMAKE_PREFIX_PATH="D:/rtp/jthread/android-build" \-DCMAKE_INSTALL_PREFIX="${OUT_DIR}" \-G "MSYS Makefiles" ./D/android-ndk-r8d-windows/android-ndk-r8d/prebuilt/windows/bin/make.exe/D/android-ndk-r8d-windows/android-ndk-r8d/prebuilt/windows/bin/make.exe installcd ${OUT_DIR}/lib && \# ${AR} -x libjthread.a && \# ${CXX} ${C_FLAGS} -shared -Wl,-soname,libjthread.so -o libjthread.so  *.obj && \${AR} -x libjrtplib.a && \${CXX} ${C_FLAGS} -shared -Wl,-soname,libjrtplib.so -o libjrtplib.so  *.obj && \rm *.objexit 0

这玩意非常重要,里面路径写错,编译出错,可能又去改代码,改了后关联文件继续报错,所以自习,上面是我的软件安装目录!

3.头文件有误了自己改改路径都能解决,add_subdirectory(examples) 错误,注释即可

android项目即可使用,之前没用过msys,所以还想尝试了下windown 下android ndk 编译,下篇讲。





0 0
原创粉丝点击