前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Android Studio编译BareSIP

用Android Studio编译BareSIP

作者头像
Seven Du
发布2020-12-21 16:20:16
1.4K0
发布2020-12-21 16:20:16
举报

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeSWITCH中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 新建项目
  • 项目引入BareSIP
    • 获取源代码
      • 引入源代码到项目中
        • 编译
        相关产品与服务
        SSL 证书
        腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档