zsmeijin
6/16/2019 - 11:44 AM

UniMRCP Client的JNI库编译

[Compile UniMRCP Client JNI] #Compile

背景

UniMRCP是一种在外呼系统中较为常见的音频传输协议,其客户端和服务器端均有C++开源代码实现。同时官方为方便其他语言进行UniMRCP的客户端开发,提供了其他语言调用Unimrcp client库的指南。

Linux编译

Linux系统Unimrcp client的JNI编译完全参照官方提供的编译步骤即可(参见:https://github.com/unispeech/swig-wrapper/blob/master/INSTALL

Windows编译

官方指南中虽然也简单提及了windows系统下的JNI编译方法,但实际编译过程中存在非常多的问题,故在此记录

  1. 安装Visual Studio

  2. 下载unimrcp dependence和src,并合并两个文件夹

  3. 编译apr静态库。进入D:\unimrcp-1.2.0\unimrcp-1.2.0\libs\apr,编译apr工程,编译选项:

    • x64 realease
    • 附加依赖库:ws2_32.lib/MSVCRT.lib
    • 将警告视为错误:否
    • 代码运行:生成库/MT
  4. 编译apr-util静态库。进入D:\unimrcp-1.2.0\unimrcp-1.2.0\libs\apr-util,编译apr-util工程,编译选项:

    • x64 realease
    • 将apr库的include路径包含到工程中,否则找不到apr.h
    • 将警告视为错误:否
    • 代码运行:生成库/MT
  5. 编译xml静态库。进入D:\Win\unimrcp-1.2.0\libs\apr-util\xml\expat\lib,编译xml工程,编译选项:

    • x64 realease
    • 将警告视为错误:否
    • 代码运行:生成库/MT
  6. 编译pthread静态库。进入D:\Win\unimrcp-1.2.0\libs\sofia-sip\win32\pthread,编译libpthread工程,编译选项:

    • x64 realease
    • 预处理器定义:PTW32_STATIC_LIB
    • 将警告视为错误:否
    • 代码运行:生成库/MT
  7. 编译sofia-sip静态库。进入D:\Win\unimrcp-1.2.0\libs\sofia-sip\win32\libsofia-sip-ua-static,编译libsofia_sip_ua_static工程,编译选项:

    • x64 realease
    • 将sofia下各个子文件夹include路径包含到工程中,否则非常多的头文件找不到
    • 预处理器定义:PTW32_STATIC_LIB
    • 附加依赖项pthreadVC2.lib(上一步编译得到)
    • 将警告视为错误:否
    • 代码运行:生成库/MT
    • 库管理器-命令行:/machine:X64
  8. 编译方案unimrcp-2010各个静态库(源码主目录下)。进入D:\Win\unimrcp-1.2.0,编译unimrcp-2010.sln方案,只编译其中libs,modules,platforms下的工程,只编译client相关的工程,编译选项:

    • 通用配置:
      • x64 realease
      • 将警告视为错误:否
      • 库目录:D:\Win\unimrcp-static,即前面4步编译出来的静态库统一放到一个文件夹“D:\Win\unimrcp-static”即可
      • 预处理器定义:APR_DECLARE_STATIC;APU_DECLARE_STATIC;LIBSOFIA_SIP_UA_STATIC;PTW32_STATIC_LIB;APT_STATIC_LIB
      • 代码运行:生成库/MT
    • 差异配置:
      • aprtoolkit
        • 附加依赖项:Rpcrt4.lib;apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mpf
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mrcp
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mrcpclient
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mrcpengine
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mrcpserver
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mrcpsignaling
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mrcpv2transport
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • unirtsp
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mrcpsofiasip
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • mrcpunirtsp
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
      • libunimrcpclient
        • 附加依赖项:apr-1.lib;aprutil-1.lib;libsofia_sip_ua_static.lib;xml.lib;
        • 忽略默认库:LIBCMT.lib
  9. 将上一步生成的所有静态库也拷贝到D:\Win\unimrcp-static下放在一起

  10. 进入cmake安装路径,修改Findswig.cmake首行中swig的执行路径

    find_program(SWIG_EXECUTABLE NAMES swig3.0 swig2.0 swig)
    set(SWIG_EXECUTABLE "C:/Program Files/swigwin-3.0.12/swig.exe")
    
  11. 将swig安装目录/Lib下的所有文件拷贝到D:\Win\swig-wrapper-static下,否则后面会找不到.swg文件,并且将Lib/java文件下的typemaps.i和所有swg也拷贝出来放在D:\Win\swig-wrapper-static下,否则找不到该文件

  12. 修改FindSofia.cmake的227行:

    file (STRINGS "${SOFIA_INCLUDE_DIR}/features/sofia-sip/sofia_features.h" _sofia_ver
    
  13. 进入D:\Win\swig-wrapper-static下,按照如下参数指定库路径,头文件路径和生成静态库选项,然后 运行cmake命令

    cmake 
    -D APR_LIBRARY=D:\Win\unimrcp-static\apr-1.lib 
    -D APR_INCLUDE_DIR=D:\Win\unimrcp-1.2.0\libs\apr\include 
    -D APU_LIBRARY=D:\Win\unimrcp-static\aprutil-1.lib 
    -D APU_INCLUDE_DIR=D:\Win\unimrcp-1.2.0\libs\apr-util\include 
    -D APU_XML_LIBRARY=D:\Win\unimrcp-static\xml.lib 
    -D SOFIA_INCLUDE_DIR=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua 
    -D SOFIA_INC_bnf=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\bnf\sofia-sip 
    -D SOFIA_INC_features=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\features\sofia-sip 
    -D SOFIA_INC_iptsec=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\iptsec\sofia-sip 
    -D SOFIA_INC_msg=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\msg\sofia-sip 
    -D SOFIA_INC_nea=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\nea\sofia-sip 
    -D SOFIA_INC_nta=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\nta\sofia-sip 
    -D SOFIA_INC_nua=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\nua\sofia-sip 
    -D SOFIA_INC_sdp=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\sdp\sofia-sip 
    -D SOFIA_INC_sip=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\sip\sofia-sip 
    -D SOFIA_INC_soa=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\soa\sofia-sip 
    -D SOFIA_INC_su=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\su\sofia-sip 
    -D SOFIA_INC_tport=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\tport\sofia-sip 
    -D SOFIA_INC_url=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\url\sofia-sip 
    -D SOFIA_INC_win32=D:\Win\unimrcp-1.2.0\libs\sofia-sip\libsofia-sip-ua\win32\sofia-sip 
    -D SOFIA_LIBRARY=D:\Win\unimrcp-static\libsofia_sip_ua_static.lib 
    -D SOFIA_PTW32_INCLUDE_DIR=D:\Win\unimrcp-1.2.0\libs\sofia-sip\win32\pthread 
    -D SOFIA_PTW32_LIBRARY=D:\Win\unimrcp-static\pthreadVC2.lib 
    -D UNIMRCP_CLIENT_LIBRARY=D:\Win\unimrcp-static\libunimrcpclient.lib 
    -D UNIMRCP_CLIENT_INCLUDE_DIRS=D:\Win\unimrcp-1.2.0\libs\mrcp-client\include 
    -D UNIMRCP_INCLUDE_DIR=D:\Win\unimrcp-1.2.0\libs\mrcp\include 
    -D UNIMRCP_SOURCE_DIR=D:\Win\unimrcp-1.2.0 
    -D UNIMRCP_aprtoolkit_LIBRARY=D:\Win\unimrcp-static\aprtoolkit.lib 
    -D UNIMRCP_mpf_LIBRARY=D:\Win\unimrcp-static\mpf.lib 
    -D UNIMRCP_mrcp_LIBRARY=D:\Win\unimrcp-static\mrcp.lib 
    -D UNIMRCP_mrcpclient_LIBRARY=D:\Win\unimrcp-static\mrcpclient.lib 
    -D UNIMRCP_mrcpsignaling_LIBRARY=D:\Win\unimrcp-static\mrcpsignaling.lib 
    -D UNIMRCP_mrcpsofiasip_LIBRARY=D:\Win\unimrcp-static\mrcpsofiasip.lib 
    -D UNIMRCP_mrcpunirtsp_LIBRARY=D:\Win\unimrcp-static\mrcpunirtsp.lib 
    -D UNIMRCP_mrcpv2transport_LIBRARY=D:\Win\unimrcp-static\mrcpv2transport.lib 
    -D UNIMRCP_unirtsp_LIBRARY=D:\Win\unimrcp-static\unirtsp.lib 
    -D CMAKE_STATIC_LINKER_FLAGS=/machine:X64 
    -D MSVCRT_STATIC=ON 
    -D APR_STATIC=ON 
    -D APU_STATIC=ON 
    -D SOFIA_STATIC=ON 
    -D UNIMRCP_STATIC=ON 
    -D SWIG_DIR=C:\Program Files\swigwin-3.0.12\Lib
    -D SWIG_EXECUTABLE=C:\Program Files\swigwin-3.0.12\swig.exe
    -D WRAP_JAVA=ON
    
  14. 编译mrcp swapper库,生成UniMRCP.dll。修改UniMRCP-wrapper.cpp中头文件路径"su_config.h"和"sofia_features.h",并将对应的文件拷贝到根目录下。进入D:\Win\swig-wrapper-static,打开UniMRCPWrapper.sln,只编译JUniMRCP工程。编译选项:

    • x64 realease
    • 动态库
    • 链接器-命令行:/machine:X64
    • 链接器-忽略依赖库:LIBCMT.lib
  15. 验证编译结果

    java -Djava.library.path=. UniRecog "D:\Win\unimrcp_test\data\grammar.xml" "D:\Win\unimrcp_test\data\demo-8kHz.pcm"
    

参考

UNIMRCP
MRCPv2
UniMRCP C++/SWIG Wrapper Released
Swig / Java
Build Swig-wrapper erro [Could NOT find APR (missing: APR_LIBRARIES APR_INCLUDE_DIRS)]