2015-05-08 3 views
0

Я выполнил инструкции по сборке, определенные в примере приложения приложения (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 static. Я могу сказать это, потому что когда я включаю файл libjingle_peerconnection_so.so в свой собственный проект (который использует такие вещи, как объекты buzz :: QN_MESSAGE и XmlElement), сборка жалуется, что эти (и другие вещи) не определены. НО каждый объект WebRTC, который у меня есть в моем коде, определен, и компилятор не жалуется.Веб-сайт libjinlge_peerconnection_so.so отсутствует Libjingle/XMPP

Я также использовал 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, он показывает, что существуют функции/символы. Тем не менее, моя установка сборки все еще утверждает, что они не определены, хотя они и есть.

UPDATE 2: Я подавил неопределенные ошибки с LOCAL_ALLOW_UNDEFINED_SYMBOLS := true в файле .mk, и завершает сборку и создали андроид файлы .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 

ответ

0

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

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

0

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

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

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

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

Смежные вопросы