WebRTC libjinlge_peerconnection_so.so отсутствует Libjingle/XMPP

Я выполнил инструкции по сборке, указанные в примере приложения для Android (AppRTCDemo) README (https://chromium.googlesource.com/external/webrtc/+/master/talk/examples/android/README), включая установку флага сборки "build_with_libjingle=1". Когда я запускаю «ninja -C out_android/Debug AppRTCDemo» (или версию Release), он компилирует все, что связано с libjingle. Однако при компиляции libjingle_peerconnection_so.so кажется, что он забывает включить различные статические библиотеки libjingle. Я могу сказать это, потому что, когда я включаю файл libjingle_peerconnection_so.so в свой собственный проект (который использует такие вещи, как объекты buzz::QN_MESSAGE и XmlElement), сборка жалуется, что эти (и другие вещи) не определены. НО каждый объект WebRTC, который у меня есть в моем коде, определен, и компилятор не жалуется.

Я также использовал nm -C и grep в файле libjingle_peerconnection_so.so в поисках символов, но результатов НЕТ. Однако в файл libjingle_peerconnection_so.ninja явно включены необходимые библиотеки (librtc_xmpp и т. д.).

Для моего проекта я использую систему ndk-build с файлами .mk (я все еще использую сборку ниндзя для 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: Конечно, когда вы посещаете что-то на следующий день, все меняется. Теперь, когда я запускаю nm в файле libjingle_peerconnection_so.so, он показывает, что функции/символы есть. Однако в моей настройке сборки по-прежнему утверждается, что они не определены, хотя они явно определены.

ОБНОВЛЕНИЕ 2: я подавил неопределенные ошибки с помощью LOCAL_ALLOW_UNDEFINED_SYMBOLS := true в файле .mk, что завершило сборку и создало файлы android .so в libs/armeabi-v7a/. Когда я запускаю эти файлы, символы находятся. Однако, когда все загружено на устройство 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

person AeroBuffalo    schedule 08.05.2015    source источник


Ответы (2)


Я до сих пор не знаю, что происходит. В конце концов, я решил написать свои собственные файлы сборки ниндзя (используя файл, созданный gyp / Google для libjingle_peerconnection_so.so в качестве шаблона), и это «решило» проблему. Мне не нужно было собирать все файлы статической библиотеки. Вместо этого я смог просто сослаться на них (как это сделал файл libjingle_peerconnection_so.ninja) и все символы и то, что теперь было правильно найдено/определено. Я предполагаю, что старая система сборки ndk-build / .mk и новая система сборки ниндзя просто НЕ смешиваются.

Я не собираюсь отмечать это как ответ на случай, если кто-то в будущем получит окончательный / реальный ответ.

person AeroBuffalo    schedule 21.05.2015

@AeroBuffalo это не ответ, а базовая стратегия сборки-отладки для массивных кодовых баз, таких как webrtc/jingle/chromium.

Такие ошибки появляются в мире msvc на этапе компиляции или компоновки при новой синхронизации webrtc. Я включаю режим подробного/диагностического вывода сборки, а затем сравниваю флаги компилятора командной строки (в основном флаги предварительной компиляции) во всех библиотеках.

Как и вы, в конце концов, у меня мало логического или интуитивного понимания довольно многих решений. Я не знаком со средой сборки linux/android, но может помочь анализ подробного дампа журналов сборки.

Я очень новичок в разработке для Android и начал играть с созданием собственного приложения для совместного использования экрана через webrtc/libjingle. Расскажите о других проблемах, с которыми вы столкнулись в средах сборки ninja/ndk.

person sith    schedule 07.06.2015