用Android Studio编译BareSIP

2020-12-21 16:20:16 浏览数 (1)

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
            ...
            ...
            ...

-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-

0 人点赞