由于G_IO_MODULES:=openssl的错误,Gstreamer教程-4无法在Android上运行



直到教程-3,它都没有任何问题。问题来自4,我认为这可能是由于gnutls和openssl的更改导致的错误。如果我将Android.mk中的G_IO_MODULES更改为gnutls,它就会构建,但一旦运行就会结束,并出现以下错误。"FORTIFY:%n在Android上不允许";

在此处输入图像描述

";FORTIFY:%n在Android上不允许">

因此,如果我修改原始的G_IO_MODULES:=openssl,它将无法执行,并出现以下错误。实际上,该路径中没有文件,只有libgiogutls.a。我该如何正常操作?我检查了名为cebero的部分中的错误,但我不知道如何修复它,也不知道如何在Android中修复它。

在此处输入图像描述

**Build command failed.
Error while executing process E:Android-r17android-ndk-r17c-windows-x86_64android-ndk-r17cndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:Users~~Desktop20_07_05_touch_pptMyApplicationappsrcmainjniAndroid.mk NDK_APPLICATION_MK=C:Users~~Desktop20_07_05_touch_pptMyApplicationappsrcmainjniApplication.mk APP_ABI=arm64-v8a NDK_ALL_ABIS=arm64-v8a NDK_DEBUG=1 APP_PLATFORM=android-21 NDK_OUT=C:/Users/~~/Desktop/20_07_05_touch_ppt/MyApplication/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=C:Users~~Desktop20_07_05_touch_pptMyApplicationappbuildintermediatesndkBuilddebuglib NDK_APPLICATION_MK=src/main/jni/Application.mk GSTREAMER_JAVA_SRC_DIR=src GSTREAMER_ROOT_ANDROID=E:Android-17.0gstreamer-1.0-android-universal-1.16.0.targstreamer-1.0-android-universal-1.16.0 GSTREAMER_ASSETS_DIR=src/assets C:/Users/~~/Desktop/20_07_05_touch_ppt/MyApplication/app/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/libtutorial-4.so}
[arm64-v8a] Compile        : tutorial-4 <= tutorial-4.c
GStreamer      : [GEN] => gst-build-arm64-v8a/gstreamer_android.c
GStreamer      : [COMPILE] => gst-build-arm64-v8a/gstreamer_android.c
GStreamer      : [LINK] => gst-build-arm64-v8a/libgstreamer_android.so
clang++.exe: error: no such file or directory: 'E:/Android-17.0/gstreamer-1.0-android-universal-1.16.0.tar/gstreamer-1.0-android-universal-1.16.0/arm64/lib/gio/modules/libgioopenssl.a'
make: *** [buildsharedlibrary_arm64-v8a] Error 1**

这是Android.mk 的完整代码

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := tutorial-4
LOCAL_SRC_FILES := tutorial-4.c
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)
ifndef GSTREAMER_ROOT_ANDROID
$(error GSTREAMER_ROOT_ANDROID is not defined!)
endif
ifeq ($(TARGET_ARCH_ABI),armeabi)
GSTREAMER_ROOT        := $(GSTREAMER_ROOT_ANDROID)/arm
else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
GSTREAMER_ROOT        := $(GSTREAMER_ROOT_ANDROID)/armv7
else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
GSTREAMER_ROOT        := $(GSTREAMER_ROOT_ANDROID)/arm64
else ifeq ($(TARGET_ARCH_ABI),x86)
GSTREAMER_ROOT        := $(GSTREAMER_ROOT_ANDROID)/x86
else ifeq ($(TARGET_ARCH_ABI),x86_64)
GSTREAMER_ROOT        := $(GSTREAMER_ROOT_ANDROID)/x86_64
else
$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
endif
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_NET) $(GSTREAMER_PLUGINS_SYS)
G_IO_MODULES              := openssl
GSTREAMER_EXTRA_DEPS      := gstreamer-video-1.0
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk

我的猜测是,您正在混合不同版本的gst-examples/gst-docs存储库和下载的GStreamer二进制文件。如果您下载了最新的稳定的GStreamer二进制文件(在撰写本文时为1.16.2(,那么您应该从gst-examples和gst-docs的1.16分支构建匹配的文件。

GStreamer master已经转移到openssl而不是gnutls,以满足其所有ssl需求,gst示例和gst-docs教程已经更新,将与1.16版本的GStreamer不兼容。

对于";FORTIFY:%n在Android上不允许";看看这个上游问题:https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/146请确保您的构建版本至少为1.16.1,并且您已经对应用程序进行了从头开始的构建,删除了所有*.o和*.so文件。

最新更新