我已按照 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