BareSIP是开源的SIP协议栈,我们可以基于BareSIP开发软电话应用。我们可以在项目中直接引入BareSIP的库,也可以将BareSIP的源代码引入到项目中,目前BareSIP还不是很稳定,因此,使用后者的方式方便我们对BareSIP进行二次开发以及修改问题。
BareSIP官方虽然也有和Android相关的文档说明,其对Android开发者而言相当不友好,虽然也有简单的Demo,但是文档描述很少,也很难应用到生产环境中,如果想基于此快速将BareSIP整合到应用中并进行二次开发,也是比较困难的。下文会一步一步讲述如何在Android Studio中使用CMake编译BareSIP。
新建项目
首先,在Android Studio中新建带有Native C 的项目,这样创建完成后,IDE会自动生成原生代码的Demo和一个简单的JNI框架。
项目引入BareSIP
通过BareSIP官网可以了解到,在编译BareSIP时,必须先构建re、rem、openssl三个库。
将BareSIP引入到项目中有两种方式,一种是直接引入所有需要的静态库,另一种是直接引入源代码并通过Android Studio进行编译,为了方便后期浏览源代码并基于BareSIP进行二次开发,我们选择后者的形式将相关库引入到项目中。
目前Android Studio编译原生代码普遍采用CMake进行构建,因此一下会涉及到一些CMake相关知识,没有接触过CMake的读者可以先自行阅读下Android NDK的CMake文档或者访问CMake官网来了解一下。
获取源代码
baresip:https://github.com/alfredh/baresip
re:https://github.com/creytiv/re
rem:https://github.com/creytiv/rem
openssl:https://github.com/openssl/openssl
引入源代码到项目中
源代码可以直接复制到项目中,最终目录类似下面的形式:
代码语言:javascript复制app
-src
-main
-cpp
-baresip (baresip源代码)
-re (re源代码)
-rem (rem源代码)
-openssl (openssl源代码)
-baresiplib (JNI接口本地实现,衔接baresip和上层应用,也可以用其他方式实现)
-CMakeLists.txt (根目录的CMake构建脚本)
先在根目录下的CMakeLists.txt引入子目录
代码语言:javascript复制cmake_minimum_required(VERSION 3.4.1)
add_subdirectory(openssl)
add_subdirectory(re)
add_subdirectory(rem)
add_subdirectory(baresip)
add_subdirectory(baresiplib)
之后在cpp下的每个子模块下分别创建CMakeLists.txt文件并编写构建规则,如下
代码语言:javascript复制app
-src
-main
-cpp
-baresip (baresip源代码)
-CMakeLists.txt
-re (re源代码)
-CMakeLists.txt
-rem (rem源代码)
-CMakeLists.txt
-openssl
-CMakeLists.txt
-baresiplib (JNI接口本地实现,衔接baresip和上层应用,也可以用其他方式实现)
-CMakeLists.txt
-CMakeLists.txt (根目录的CMake构建脚本)
然后在编写每个子模块下的CMakeLists.txt
openssl
openssl源代码是Makefile方式构建,因此我们需要手动编写CMakeLists.txt
代码语言:javascript复制cmake_minimum_required(VERSION 3.4.1)
include_directories(include)
file(GLOB_RECURSE SRC_FILES "*.c")
file(GLOB_RECURSE HEADER_FILES "*.h")
add_library(libopenssl STATIC ${SRC_FILES} ${HEADER_FILES})
re
在re源代码的mk目录下有CMakeLists.txt文件,但是直接引用可能无法在Android Studio中进行编译,因此我们需要修改或者直接新建一个CMakeLists.txt,注意编译re需要引用openssl头文件
代码语言:javascript复制cmake_minimum_required(VERSION 3.4.1)
include_directories(include)
include_directories(../openssl/include)
file(GLOB_RECURSE SRC_FILES "src/*.c")
file(GLOB_RECURSE HEADER_FILES src/*.h include/*.h)
# 移除在Android系统上不需要的源文件
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/aes/apple/aes.c")
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/dns/darwin/srv.c")
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/dns/win32/srv.c")
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/dns/res.c")
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/hmac/apple/hmac.c")
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/lock/win32/lock.c")
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/mod/win32/dll.c")
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/mqueue/win32/pipe.c")
LIST(REMOVE_ITEM SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/net/win32/wif.c")
add_library(re STATIC ${SRC_FILES} ${HEADER_FILES})
rem
编译rem需要引用re的头文件
代码语言:javascript复制include_directories(include)
include_directories(../re/include)
file(GLOB_RECURSE SRC_FILES "src/*.c")
file(GLOB_RECURSE HEADER_FILES src/*.h include/*.h)
add_library(rem STATIC ${SRC_FILES} ${HEADER_FILES})
baresip
编译baresip需要引用re、rem的头文件,这里没有引入baresip中的模块代码
代码语言:javascript复制cmake_minimum_required(VERSION 3.4.1)
include_directories(include)
include_directories(../re/include)
include_directories(../rem/include)
file(GLOB_RECURSE SRC_FILES "src/*.c")
file(GLOB_RECURSE HEADER_FILES src/*.h include/*.h)
add_library(baresip STATIC ${SRC_FILES} ${HEADER_FILES})
baresiplib
上述的几个模块都编译为静态库,而baresiplib是我们提供给上层APP在运行时使用的接口模块,因此要编译成动态库,且链接上述编译的几个静态库
代码语言:javascript复制cmake_minimum_required(VERSION 3.4.1)
include_directories(../baresip/re)
include_directories(../baresip/rem)
include_directories(../baresip/include)
add_library(
baresip-lib
SHARED
baresip-lib.cpp)
target_link_libraries(
baresip-lib
log
libcrypto
libssl
re
rem
baresip)
编译
CMake脚本编写完成后可直接编译,如果有编译错误问题可以根据具体问题进行修改,编译成功后可以在编译输出文件的目录下找到编译好的baresip、openssl、re、rem等静态库,如下:
代码语言:javascript复制app
-.externalNativeBuild
-cmake
-debug
-arm64-v8a
-baresip
-libbaresip.a
...
...
...
-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-