Android WebRTC 编译注意事项

发布时间 2023-10-13 12:04:54作者: 雨夜独行1988

Android WebRTC 编译注意事项

说明

  • 文主要适用于需要从外部C++文件调用WebRTC C++接口的场景
  • 本文对应的源码基于m111分支,高版本的也可以参考

Android平台用默认参数编译Android WebRTC存在的主要问题

  • RTTI 默认未开启
  • C++库默认使用了webrtc内部的C++库,与外部C++库abi不兼容,由于符号不同可能会链接失败,侥幸编译通过,也会在运行时由于内存布局不一致,引发崩溃
  • 默认只暴露JNI的符号,其他符号都引用不到

解决方案

RTTI开启

在编译参数加上

use_rtti=true

使用通用的C++库

在编译参数加上

use_custom_libcxx = false

加上这个参数后发现一些_Undiwnd_开头的链接失败了。 原因是WebRTC脚本里面存在bug:
在src/build/config/Android/BUILD.gn中,无差别的关闭了libunwind的链接:
image
而关闭这个的原因是使用webrtc定制的libc++的时候,链接了webrtc内部的libunwind:
image
而关闭use_custom_libcxx后,--unwindlib=none这个链接选项依然work,然而并没有去link libunwind这个库。解决方案:

  • 在buildtools/third_party/libunwind中,修改BUILD.gn,将Libunwind可见性暴露给libjingle_peerconnection_so.so:
    image
  • 链接libjingle_peerconnection_so.so链接libunwind.a
    image

暴露C++符号

  • 将默认visibility改成default
    image
  • 修改android so导出配置文件
    image

image