Связывание gstreamer tutorial4 создает ошибку

#gstreamer #ndk-build

Вопрос:

Разработка на Linux Mint 20.2 с подключенным USB Samsung GT-P3113. Android-студия(Artic Fox 2020.3.1) установлена, но вы хотите запустить Ndk-сборку (/home/george/Android/Sdk/ndk/23.0.7599858/ndk-сборка) из командной строки терминала GNOME. Я могу успешно (создавать/устанавливать/запускать) учебные пособия _1, _2 и _3, если я изменю $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk:

 from:
GSTREAMER_LD                  := -fuse-ld=gold$(EXE_SUFFIX) -Wl,-soname,lib$(GSTREAMER_ANDROID_MODULE_NAME).so
to:
GSTREAMER_LD                  := -fuse-ld=$(EXE_SUFFIX) -Wl,-soname,lib$(GSTREAMER_ANDROID_MODULE_NAME).so
 

Однако tutorial_4 и tutorial_5 создают ошибку ld:

 GStreamer      : [GEN] => gst-build-armeabi-v7a/gstreamer_android.c
GStreamer      : [COMPILE] => gst-build-armeabi-v7a/gstreamer_android.c
GStreamer      : [LINK] => gst-build-armeabi-v7a/libgstreamer_android.so
ld: error: unable to find library -lgcc
clang  : error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/home/george/Android/gstreamer-1.0-android-universal-1.18.5/armv7/share/gst-android/ndk-build//gstreamer-1.0.mk:234: buildsharedlibrary_armeabi-v7a] Error 1
 

Я пробовал версии gstreamer-1.0-android-universal-1.16.3, 1.18.4 и 1.18.5 с тем же результатом. Ошибка возникает при использовании плагина $(GSTREAMER_PLUGINS_NET). Чтобы сузить проблему, я заменил GSTREAMER_PLUGINS_NET на GSTREAMER_PLUGINS_NET_RESTRICTED.

 GStreamer      : [GEN] => gst-build-armeabi-v7a/gstreamer_android.c
GStreamer      : [COMPILE] => gst-build-armeabi-v7a/gstreamer_android.c
GStreamer      : [LINK] => gst-build-armeabi-v7a/libgstreamer_android.so
ld: warning: /home/jan/devel/gstreamer/cerbero/build/sources/android_universal/armv7/wavpack-5.1.0/src/unpack.c:132:(.text.unpack_samples 0xAF0): branch and link relocation: R_ARM_THM_CALL to non STT_FUNC symbol: unpack_decorr_mono_pass_cont_armv7 interworking not performed; consider using directive '.type unpack_decorr_mono_pass_cont_armv7, %function' to give symbol type STT_FUNC if interworking between ARM and Thumb is required
ld: warning: /home/jan/devel/gstreamer/cerbero/build/sources/android_universal/armv7/wavpack-5.1.0/src/unpack.c:189:(.text.unpack_samples 0xBDA): branch and link relocation: R_ARM_THM_CALL to non STT_FUNC symbol: unpack_decorr_stereo_pass_cont_armv7 interworking not performed; consider using directive '.type unpack_decorr_stereo_pass_cont_armv7, %function' to give symbol type STT_FUNC if interworking between ARM and Thumb is required
Done mkdir
Done cp
[armeabi-v7a] Prebuilt       : libgstreamer_android.so <= gst-build-armeabi-v7a/
Done rm
[armeabi-v7a] Install        : libgstreamer_android.so => libs/armeabi-v7a/libgstreamer_android.so
[armeabi-v7a] Compile thumb  : tutorial-4 <= tutorial-4.c
[armeabi-v7a] Compile   thumb: tutorial-4 <= dummy.cpp
[armeabi-v7a] Prebuilt       : libc  _shared.so <= <NDK>/sources/cxx-stl/llvm-libc  /libs/armeabi-v7a/
[armeabi-v7a] SharedLibrary  : libtutorial-4.so
[armeabi-v7a] Install        : libtutorial-4.so => libs/armeabi-v7a/libtutorial-4.so
[armeabi-v7a] Install        : libc  _shared.so => libs/armeabi-v7a/libc  _shared.so
 

Это было успешно (компиляция,ссылка,установка), но вызвало ожидаемую ошибку во время выполнения:

Ошибка, полученная от элемента urldecodebin0:для «https» не реализован обработчик URI

Где находится библиотека «gcc» в загруженном gstreamer-1.0-android-universal-1.18.X? Нужно ли его компилировать? Как мне действовать дальше?

Application.mk

 APP_ABI = armeabi-v7a
APP_STL = c  _shared
APP_PLATFORM = android-23
 

Android.mk

 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := tutorial-4
LOCAL_SRC_FILES := tutorial-4.c dummy.cpp
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)

# GSTREAMER_ROOT_ANDROID:=/home/george/Android/gstreamer-1.0-android-universal-1.16.3
# GSTREAMER_ROOT_ANDROID:=/home/george/Android/gstreamer-1.0-android-universal-1.18.4
GSTREAMER_ROOT_ANDROID:=/home/george/Android/gstreamer-1.0-android-universal-1.18.5
ifndef GSTREAMER_ROOT_ANDROID
$(error GSTREAMER_ROOT_ANDROID is not defined!)
endif

GSTREAMER_ROOT            := $(GSTREAMER_ROOT_ANDROID)/armv7
GSTREAMER_NDK_BUILD_PATH  := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS         := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_PLAYBACK) $(GSTREAMER_PLUGINS_CODECS) $(GSTREAMER_PLUGINS_SYS)
GSTREAMER_PLUGINS          = $(GSTREAMER_PLUGINS_NET)    
G_IO_MODULES              := openssl
GSTREAMER_EXTRA_DEPS      := gstreamer-video-1.0
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
 

Комментарии:

1. libgcc является частью компилятора GCC. Поскольку вы используете clang для компиляции, этого, скорее всего, не существует. Вероятно, простое удаление его из пакета, который его извлекает, может заставить его работать.