0

我已按照 android 示例应用程序 (AppRTCDemo) README ( https://chromium.googlesource.com/external/webrtc/+/master/talk/examples/android/README ) 中定义的构建说明进行操作,包括设置构建标志“ build_with_libjingle=1”。当我运行“ninja -C out_android/Debug AppRTCDemo”(或发布版本)时,它会编译与 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 系统(我仍在使用 ninja build stuff for 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:LOCAL_ALLOW_UNDEFINED_SYMBOLS := true在 .mk 文件中抑制了未定义的错误,这完成了构建并在 libs/armeabi-v7a/ 中创建了 android .so 文件。当我 nm 这些文件时,会找到符号。但是,当所有内容都加载到 android 设备时,应用程序崩溃,说它找不到(例如)_ZN4buzz11QN_PRESENCEE我的库 (myproject.so) 中引用的符号。纳米结果:

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
4

2 回答 2

0

我仍然不知道发生了什么事。最终,我决定编写自己的 ninja 构建文件(使用由 gyp/Google 为 libjingle_peerconnection_so.so 创建的文件作为模板)并“解决”了问题。我不必构建所有静态库文件。相反,我能够只引用它们(就像 libjingle_peerconnection_so.ninja 文件所做的那样)以及所有符号以及现在正确找到/定义的符号。我想,不知何故,旧的 ndk-build / .mk 构建系统和新的 ninja 构建系统不能混合使用。

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

于 2015-05-21T23:33:01.820 回答
0

@AeroBuffalo 这不是答案,而是针对大量代码库(例如 webrtc/jingle/chromium)的准系统构建调试策略。

在重新同步 webrtc 的编译或链接阶段,msvc 世界中会弹出此类错误。我打开详细/诊断构建输出模式,然后比较所有库中的命令行编译器标志(主要是预编译标志)。

就像你所经历的那样,我最终对很多解决方案几乎没有逻辑或直观的理解。我不熟悉 linux/android 构建环境,但分析构建日志的详细转储可能会有所帮助。

我对 android 开发非常陌生,并开始尝试通过 webrtc/libjingle 获取本机屏幕共享应用程序。请分享您在 ninja/ndk 构建环境中遇到的任何其他问题。

于 2015-06-07T13:57:27.570 回答