WebRTC libjinlge_peerconnection_so.so missing Libjingle / XM



我遵循了Android示例应用程序(AdrytcDemo)Readme(https://chromium.googlesource.com/external/webrtc/ master/master/talk/examples/)android/readme),包括设置构建标志" build_with_libjingle = 1"。当我运行" ninja -c out_android/debug andtcdemo"(或发行版本)时,它会编译与libjingle相关的所有内容。但是,当它编译libjingle_peerconnection_so.so时,似乎忘记了包括各种libjingle静态库。我可以说这一点,因为当我将libjingle_peerconnection_so.so在我自己的项目中包含时(使用buzz :: qn_message和xmlelement对象之类的内容)构建抱怨说这些(和其他事物)未定义。但是,我在代码中拥有的每个WEBRTC对象都已定义,并且编译器不会抱怨。

我还在libjingle_peerconnection_so.so文件上使用了nm -c和grep,查找符号,并且没有返回结果。但是,libjingle_peerconnection_so.ninja文件显然包含了必要的库(librtc_xmpp等)。

对于我的项目,我正在使用.mk文件的NDK-build系统(我仍在为libjingle/webrtc使用忍者构建的东西)。我已经尝试抛弃.so文件,而是使用.MK文件中的每个静态库,但是随后引入了许多其他未定义的错误,这些错误比使用.SO文件少。我有多个版本的.mk文件,我使用了一个使用libjingle_peerconnection_so.so文件。

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libjingle_peerconnection_so
cmd-strip :=
LOCAL_SRC_FILES := libjingle_peerconnection_so.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := myproject
LOCAL_MODULE_TAGS := optional
LOCAL_CPP_EXTENSION := .cpp 
    .cc
LOCAL_SRC_FILES := 
    presencepushtask.cc 
    CallItem.cpp 
    Video.cpp 
    XMPP.cpp 
    JNIMain.cpp
LIBJINGLE_CPPFLAGS := 
    -DHAMMER_TIME=1 
    -DHAS_OPENSSL_1_0 
    -DHAVE_DTLS_SRTP 
    -DGTEST_RELATIVE_PATH 
    -DDISABLE_DYNAMIC_CAST 
    -D_REENTRANT 
    -DWEBRTC_POSIX 
    -DOS_LINUX=OS_LINUX 
    -DLINUX 
    -DANDROID 
    -DEXPAT_RELATIVE_PATH 
    -DSRTP_RELATIVE_PATH 
    -DXML_STATIC 
    -DFEATURE_ENABLE_SSL 
    -DHAVE_OPENSSL_SSL_H=1 
    -DFEATURE_ENABLE_VOICEMAIL 
    -DFEATURE_ENABLE_PSTN 
    -DHAVE_WEBRTC_VIDEO 
    -DHAVE_WEBRTC_VOICE 
    -DHAVE_SRTP 
    -DLOGGING 
    -DNO_SOUND_SYSTEM 
    -DARCH_CPU_LITTLE_ENDIAN 
    -DJSONCPP_RELATIVE_PATH 
    -DWEBRTC_RELATIVE_PATH 
    -D_DEBUG
LOCAL_CFLAGS := 
    $(LIBJINGLE_CPPFLAGS) 
    -O2 
    -std=c++11 
    -fexceptions
LOCAL_C_INCLUDES := 
    $(LOCAL_PATH) 
    $(LOCAL_PATH)/../../ProjectLibs 
    $(LOCAL_PATH)/../../ProjectLibs/Kino 
    $(LOCAL_PATH)/../../ProjectLibs/android-logging 
    $(LOCAL_PATH)/../../ThirdPartyLibs/openssl/openssl/include 
    $(LOCAL_PATH)/../../ThirdPartyLibs/WebRTC/src 
    $(LOCAL_PATH)/../../ThirdPartyLibs/WebRTC/src/webrtc 
    $(LOCAL_PATH)/../../ThirdPartyLibs/WebRTC/src/chromium/src/third_party/jsoncpp/source/include 
    $(LOCAL_PATH)/../../ThirdPartyLibs/WebRTC/src/chromium/src/third_party/icu/source/common
LOCAL_SHARED_LIBRARIES := 
    libcrypto-mod 
    libssl-mod 
    libjingle_peerconnection_so
LOCAL_LDLIBS := 
    -L$(NDK_PROJECT_PATH)/toolchain/sysroot/usr/lib 
    -llog 
    -lOpenSLES 
    -lGLESv2 
    -lc 
    -ljnigraphics 
    -ldl
include $(BUILD_SHARED_LIBRARY)

我做错了什么?还是构建系统有问题?

更新1:当然,当您第二天访问某些东西时,一切都会改变。现在,当我在libjingle_peerconnection_so.so上运行nm时,它表明函数/符号在那里。但是,我的构建设置仍然声称它们没有定义,即使它们显然是。

更新2:我在.mk文件中使用LOCAL_ALLOW_UNDEFINED_SYMBOLS := true抑制了未定义的错误,并在libs/armeabi-v7a/中完成了构建并创建了android .so文件。当我nm这些文件时,会找到符号。但是,当所有内容都加载到Android设备上时,应用程序崩溃了,说它找不到(例如)我的库中引用的符号_ZN4buzz11QN_PRESENCEE(myProject.so)。NM结果:

nm libs/armeabi-v7a/libkinoproject.so | grep QN_PRESENCE
4983:         U _ZN4buzz10QN_PRESENCEE
nm libs/armeabi-v7a/libjingle_peerconnection_so.so | grep QN_PRESENCE
100840:005f65f8 d _ZN4buzz11QN_PRESENCEE

我仍然不知道发生了什么。最终,我决定编写自己的忍者构建文件(使用GYP/Google创建的文件为libjingle_peerconnection_so.so.so作为tempalte),然后"解决"了问题。我不必构建所有静态库文件。取而代之的是,我只能将它们引用(如libjingle_peerconnection_so.ninja文件所做的那样)以及所有符号以及现在正确找到/定义的内容。我想,不知何故,旧的NDK构建/.MK构建系统和新的Ninja构建系统只是不混合。

我不会将其标记为答案,以防将来有人有确切/真实的答案。

@aerobuffalo这不是答案,而是针对大规模代码库(例如webrtc/jingle/chromium)的Barybores build-debug策略。

在汇编或链接阶段的新鲜同步中,在MSVC世界中出现了此类错误。我打开冗长/诊断构建输出模式,然后比较所有库中的命令行编译器标志(主要是预编译标志)。

就像您所经历的一样,最终我几乎没有逻辑或直观的理解,以做出许多决议。我不熟悉Linux/Android构建环境,但是分析构建日志的详细信息可能会有所帮助。

我是Android开发的新手,并开始通过WebRTC/libjingle进行本机屏幕共享应用程序。请分享您在忍者/NDK构建环境中遇到的任何其他问题。

相关内容

  • 没有找到相关文章

最新更新