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的链接:
而关闭这个的原因是使用webrtc定制的libc++的时候,链接了webrtc内部的libunwind:
而关闭use_custom_libcxx后,--unwindlib=none这个链接选项依然work,然而并没有去link libunwind这个库。解决方案:
- 在buildtools/third_party/libunwind中,修改BUILD.gn,将Libunwind可见性暴露给libjingle_peerconnection_so.so:
- 链接libjingle_peerconnection_so.so链接libunwind.a
暴露C++符号
- 将默认visibility改成default
- 修改android so导出配置文件