在Android NDK项目中使用webrtc-58 - 使用QT构建时"Undefined reference to CopyOnWriteBuffer"

Using webrtc-58 in Android NDK project - "Undefined reference to CopyOnWriteBuffer" when building with QT

本文关键字:QT 构建 Undefined CopyOnWriteBuffer to reference 使用 项目 NDK Android webrtc-58      更新时间:2023-10-16

我正在尝试为Android NDK构建一个共享库,该库引用了webrtc-58为Android构建的libjingle_peerconnection.so,但出现了链接器错误:

MyProjectLibswebrtc-58includewebrtcapidatachannelinterface.h:64: error: undefined reference to 'rtc::CopyOnWriteBuffer::~CopyOnWriteBuffer()'
MyProjectLibswebrtc-58includewebrtcbasecopyonwritebuffer.h:48: error: undefined reference to 'rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int, unsigned int)'

我在 Ubuntu 和 Windows 上构建项目的输出相同。在 Ubuntu 上构建时,我将 QT Creator 配置为使用 webrtc 构建工具中的 Android SDK/NDK(用于构建libjingle_peerconnection

QT 创建器 4.4.1 在 Qt5.9.2 上 webrtc-58 是在 Ubuntu 上构建的,使用以下配置。

gn gen out/Debug/arm-v7 --args='target_os="android" is_component_build=false rtc_include_tests=false target_cpu="arm"'

我已经转储了未剥离的 libjingle_peerconnection.so,并注意到其中包含 CopyOnWriteBuffer 类实现:

001b2bbd t void rtc::CopyOnWriteBuffer::AppendData<unsigned char, (void*)0>(unsigned char const*, unsigned int)
000ee055 t rtc::CopyOnWriteBuffer::EnsureCapacity(unsigned int)
000edf51 t rtc::CopyOnWriteBuffer::CloneDataIfReferenced(unsigned int)
000fafd9 t char* rtc::CopyOnWriteBuffer::data<char, (void*)0>()
000fae61 t unsigned char* rtc::CopyOnWriteBuffer::data<unsigned char, (void*)0>()
000eddcd t rtc::CopyOnWriteBuffer::Clear()
00092cd1 t void rtc::CopyOnWriteBuffer::SetData<char, (void*)0>(char const*, unsigned int)
00092cd1 t void rtc::CopyOnWriteBuffer::SetData<unsigned char, (void*)0>(unsigned char const*, unsigned int)
000edb4d t rtc::CopyOnWriteBuffer::SetSize(unsigned int)
000fad19 t rtc::CopyOnWriteBuffer::operator=(rtc::CopyOnWriteBuffer&&)
000ed6f1 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int)
000ed7d9 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int, unsigned int)
000ed6e1 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(rtc::CopyOnWriteBuffer&&)
0003462f t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(rtc::CopyOnWriteBuffer const&)
0002f1f7 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer()
000faa35 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer<char, (void*)0>(char const*, unsigned int)
000ed6f1 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int)
000ed7d9 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int, unsigned int)
000ed6e1 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(rtc::CopyOnWriteBuffer&&)
0003462f t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(rtc::CopyOnWriteBuffer const&)
0002f1f7 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer()
000faa35 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer<char, (void*)0>(char const*, unsigned int)
0003452d t rtc::CopyOnWriteBuffer::~CopyOnWriteBuffer()
0003452d t rtc::CopyOnWriteBuffer::~CopyOnWriteBuffer()

MYPROJECT_Core.Pro的内容

QT  += core xml
QT  -= gui
TARGET = MYPROJECT_Core
TEMPLATE = lib
DEFINES += MYPROJECT_CORE_LIBRARY
DEFINES += QT_DEPRECATED_WARNINGS
DEFINES += NOMINMAX
DEFINES += ENABLE_RTC_EVENT_LOG

QMAKE_CFLAGS_WARN_ON -= -Wall
QMAKE_CXXFLAGS_WARN_ON -= -Wall
CONFIG += warn_off
android {
    CONFIG += c++11
    QMAKE_CXXFLAGS += -std=c++11
    DEFINES += NDEBUG=1
    DEFINES += WEBRTC_POSIX
    DEFINES += WEBRTC_ANDROID
    LIBS += -L$$PWD/../Libs/webrtc-58/lib/android/armeabi-v7a/jni/armeabi-v7a -ljingle_peerconnection_so
    INCLUDEPATH += $$PWD/../Libs/webrtc-58/include
    DEPENDPATH += $$PWD/../Libs/webrtc-58/include
} 

SOURCES += 
    main.cpp 

我的同事今天解决了这个问题。他用webrtc build output的另一个库替换了libjingle_peerconnection.so。

obj/webrtc/api/libjingle_peerconnection_api.a
ob/webrtc/base/librtc_base_approved.a
QT Android Kit和webrtc

构建系统也存在兼容性问题,所以Android Kit是用gnustl构建的,而webrtc是用libc++构建的,所以他包含了Android NDK捆绑包中的libc++_shared.so。整个Pro文件将如下所示

QT       -= gui
TARGET = WebRtcDependantLib
TEMPLATE = lib
#CONFIG += c++11
QMAKE_CXXFLAGS += -fno-rtti -fno-exceptions
DEFINES += MY_TEST_LIBRARY
android {
    DEFINES += WEBRTC_POSIX
    DEFINES += WEBRTC_ANDROID

    DEFINES += NDEBUG
    WEBRTC = /home/user/Dev/src  #WEBRTC-M58 sources directory
    WEBRTCBUILD = $$WEBRTC/out/Debug/arm-v7/obj
    #android NDK bundled by webrtc build system
    WEBRTCNDK = $$WEBRTC/third_party/android_tools/ndk
    LIBS += -Wl,--start-group
    LIBS += $$WEBRTCBUILD/webrtc/api/libjingle_peerconnection_api.a
    LIBS += $$WEBRTCBUILD/webrtc/base/librtc_base_approved.a
    LIBS += -Wl,--end-group
    LIBS += $$WEBRTCNDK/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so 
    INCLUDEPATH += $$WEBRTC
    DEPENDPATH += $$WEBRTC
}
SOURCES += 
        main.cpp

我不了解WebRTC-58,但我知道WebRTC 60有一个脚本可以为你构建Android库。 从 src/目录中,只需运行

python tools_webrtc/android/build_aar.py

这将为您配置所有内容,为 x86、x86_64、arm 和 arm64 构建,并将它们组合到 libwebrtc.aar 中,您可以将其添加到您的 android 项目中。