【问题标题】:Android Studio ERROR: Executing external native build for ndkBuild when trying to run Gstreamer tutorialAndroid Studio 错误:尝试运行 Gstreamer 教程时为 ndkBuild 执行外部原生构建
【发布时间】:2020-01-11 07:16:34
【问题描述】:

我正在尝试在 Android Sudio 3.5 中运行 gstreamer android tutorial-5 (https://gitlab.freedesktop.org/gstreamer/gst-docs/tree/master/examples/tutorials/android)(https://gitlab.com/eduardoprado/gstreamer-tutorial5) 但收到以下错误:

ERROR: Cause: executing external native build for ndkBuild C:\Users\Downloads\gst_docs_master_examples_tutorials_android\examples\tutorials\android\android-tutorial-1\jni\Android.mk. 

我一直在关注 gstreamer 网站上的 gstreamer android 教程以及 stackoverflow 线程 Gstreamer examples in Android Studio

第一个目标是让 gstreamer 在 android studio 上运行。

有一些线程错误与路径目录中的空格有关,但我检查过所有文件夹都没有空格。以下是我一直在使用和调整以使教程运行的一些文件。

我还将我的 Windows 环境变量 GSTREAMER_ROOT_ANDROID 设置为解压后的 gstreamer 二进制文件,并将其设置在 android.mk 文件中。

local.properties 文件

## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Mon Sep 09 08:16:12 EDT 2019
sdk.dir=C\:\\Users\\AppData\\Local\\Android\\Sdk
ndk.dir=C\:\\Users\\AppData\\Local\\Android\\Sdk\\ndk\\20.0.5594570

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := tutorial-5
LOCAL_SRC_FILES := tutorial-5.c
LOCAL_SHARED_LIBRARIES := gstreamer_android
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)

GSTREAMER_ROOT_ANDROID := C\:\\gstreamer_android_binaries

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              := gnutls
GSTREAMER_EXTRA_DEPS      := gstreamer-video-1.0
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk

build.gradle(应用程序)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "26.0.3"

    defaultConfig {
        applicationId "com.gst_sdk_tutorials.tutorial_5"
        minSdkVersion 14
        targetSdkVersion 29

        externalNativeBuild {
            ndkBuild {
                arguments "V=1"
            }
        }

        ndk {
            moduleName "tutorial-5"
            abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
}

build.gradle(项目)

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

gradle-wrapper.properties

#Mon Sep 09 14:10:17 EDT 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

更新 将参数“V=1”添加到 ndkBuild 部分并收到相同的错误:

ERROR: Cause: executing external native build for ndkBuild C:\Users\Downloads\gstreamer-tutorial5-master\app\src\main\jni\Android.mk

【问题讨论】:

  • 在任何地方都没有实际错误吗?除了“出了点问题”之外,我在这里没有看到任何错误消息。
  • 在 Run Build -> Gradle Sync Issues 下出现错误。 ERROR: Cause: executing external native build for ndkBuild C:\Users\Downloads\gst_docs_master_examples_tutorials_android\examples\tutorials\android\android-tutorial-1\jni\Android.mk.
  • 这个ndkBuild_build_command.txt文件不属于你的电脑,它来自一些Linux机器。请同时删除.cxx.externalNdkBuild 目录,然后再次运行Gradle Sync。您将获得另一个ndkBuild_build_command.txt 文件。请在此处发布,或使用与此文件中所述相同的参数,从 CMD 提示符运行 ndk-build.cmd。我希望它能给你很好的提示,告诉你出了什么问题。

标签: android-studio android-ndk gstreamer ndk-build


【解决方案1】:

很可能您使用的路径对于 Windows 命令行来说太长了。为了更好地了解发生了什么,请将"V=1" 添加到 ndkBuild 的参数列表中,您将看到在构建控制台中执行的所有构建命令。

【讨论】:

  • 我在 ndkBuild 中添加了“V=1”。我在帖子中添加了收到的错误。
【解决方案2】:

arguments 配置属于android.defaultConfig.externalNativeBuild.ndkBuild 部分,而不是android.externalNativeBuild.ndkBuild。查看文档:https://developer.android.com/ndk/guides/cmake#variables

【讨论】:

  • 谢谢,已将参数移至相应部分。不幸的是,仍然再次收到原始错误。如果有帮助的话,我还添加了运行构建部分的错误
  • 在出现错误之前,构建日志中是否出现了一些其他输出?无论如何,请查看C:\Users\m0l\Downloads\gstreamer-tutorial5-master\app 目录。有一个.cxx.externalNativeBuild 子目录。在里面,应该有一些文本文件显示您的 ndk-build 是如何被调用的。
  • @AlexCohn 我确实有 .cxx 和 .externalNativeBuild 文件夹。在.cxx 文件夹中有ndk_locator_record.jsonndkBuild folder,其中包含build_model.jsonjson_generation_record.json.externalNativeBuild folder contains ndkBuild\debug 包含所有 ABI(arm64-v8a 等)。在每个 ABI 文件夹中都有 android_gradle_build.json, ndkBuild_build_command.txt, ndkBuild_build_output.txt 我在上面添加了看起来很有趣的文件。似乎可执行行具有不同的路径。我不确定要寻找什么。
【解决方案3】:
  1. 下载整个gstreamer android studio 教程目录(https://gitlab.freedesktop.org/gstreamer/gst-docs/)

2)打开 Android Studio -> 打开现有的 Android Studio 项目

  1. 将整个android教程目录examples/tutorials/android作为项目打开

4)打开项目后,将屏幕左侧的视图更改为Project

  1. 在local.properties文件附近右键->新建->文件

  2. 创建一个名为gradle.properties的新文件

  3. 在新的gradle.properties 文件中复制并粘贴以下代码。

# gstAndroidRoot can be set to point to the unpacked GStreamer android top-level directory
# containing each architecture in subdirectories, or else set the GSTREAMER_ROOT_ANDROID
# environment variable to that location
gstAndroidRoot=/gstreamer_android_binaries

注意 将 gstAndroidRoot 变量更改为您下载 gstreamer 二进制文件并解压缩它们的文件路径。 Gstreamer 可以从这里下载 Android (https://gstreamer.freedesktop.org/data/pkg/android/)

  1. 现在我们需要设置 NDK 目录。确保您在 SDK 工具下下载并启用了 NDK。

9) 这将下载最新的 NDK 版本。但是 gstreamer 目前不会使用最新的 NDK 构建。我们需要下载 NDK Revision 18b (https://developer.android.com/ndk/downloads/older_releases) 如果您不使用 NDK 版本 18,您可能会收到错误 Android NDK: Assertion failure: SYSROOT_LINK is not defined . Stop. Open File

  1. 解压下载的NDK 18b目录。

  2. 将解压后的android-ndk-r18b目录移动到ndk文件夹在AppData\Local\Android\Sdk\ndk下的位置

  3. 您现在应该在Android\Sdk\ndk 中有两个文件夹。 20.0.5594570 (or latest version)android-ndk-r18b

  4. 在 android studio 中转到文件 -> 项目结构

  5. 在 Android NDK 位置指向 NDK 18 目录。示例:C:\Users\AppData\Local\Android\Sdk\ndk\android-ndk-r18b

  6. 用USB调试连接手机并运行!

  7. 如果您在手机上收到错误消息,说明它是针对旧版本的 android。返回 Android Studio 并切换到屏幕左侧的Android View。在Gradle Scripts 下选择build.gradle 以获得相应的教程。更改compileSdkVersion 29minSDKVersion 15targetSDKVersion 29

【讨论】:

  • 非常感谢您。它对我帮助很大。
  • 谢谢,但是当我按照这些步骤进行操作时,它会构建,但在某些时候我收到一条错误消息,指出“本机构建错误”我猜它是链接到 make 文件。这个错误很奇怪,因为它没有说明错误的原因。
【解决方案4】:

请在build.gradle(应用程序)发表评论:

externalNativeBuild {
         ndkBuild {
             path 'src/main/jni/Android.mk'
         }
     }

【讨论】:

  • 这如何解决问题?它基本上只可能允许您的 gradle 构建没有任何错误,但它不会使本机库可用。
【解决方案5】:

只需将您的项目移动到路径没有空格

/Users/myuser/Documents/android-project-folder 示例

它帮助了我

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多