我遵循了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构建环境中遇到的任何其他问题。