0

我一直在尝试在我的 android 应用程序中将 GStreamer 从 1.14 升级到 1.16 版,但遇到了一些问题。根据 gstreamer 的网站,1.16 版需要 Android NDK r18b。当我尝试使用 NDK r18b 运行 GStreamer 1.16 时,我在 android studio 中遇到错误:

Expected ndk stl shared object file at /home/exjobb/Documents/android-ndk-r18-b-linux-x86_64/android-ndk-r18b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a /libgnustl_shared.so

cxx-stl 文件夹不在我的电脑上,后面的文件夹/文件也不在。

我用谷歌搜索过,似乎一般建议是降级到 r17c。如果 GStreamer 1.16 需要 r18b,我不能这样做。

这里可能是什么问题?

编辑:

我有两个不同的 build.gradle 文件。

这是第一个:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28

    defaultConfig {
        applicationId "se.liu.mrleo"
        minSdkVersion 23
        versionCode 1
        versionName "1.0"

        externalNativeBuild {
            ndkBuild {
                def gstRoot
                if (project.hasProperty('gstAndroidRoot'))
                    gstRoot = project.gstAndroidRoot
                else
                    gstRoot = System.env.GSTREAMER_ROOT_ANDROID
                if (gstRoot == null)
                    throw new FileNotFoundException('GSTREAMER_ROOT_ANDROID not set')

                arguments "NDK_APPLICATION_MK=jni/Application.mk",
                        "GSTREAMER_JAVA_SRC_DIR=src",
                        "GSTREAMER_ROOT_ANDROID=$gstRoot",
                        "GSTREAMER_ASSETS_DIR=src/main/assets"

                targets "gstmredge"

                abiFilters  'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            sourceSets {
                main {
                    manifest.srcFile 'AndroidManifest.xml'
                    java.srcDirs = ['src']
                    resources.srcDirs = ['src']
                    aidl.srcDirs = ['src']
                    renderscript.srcDirs = ['src']
                    res.srcDirs = ['res']
                    assets.srcDirs = ['assets']
                }
            }
        }
    }


    externalNativeBuild {
        ndkBuild {
            path 'jni/Android.mk'
            //path 'jni/Application.mk'
        }
    }

    buildToolsVersion = '28.0.3'
    compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }
}

afterEvaluate {
    if (project.hasProperty('compileDebugJavaWithJavac')) {
        project.compileDebugJavaWithJavac.dependsOn 'externalNativeBuildDebug'
    }
    if (project.hasProperty('compileReleaseJavaWithJavac')) {
        project.compileReleaseJavaWithJavac.dependsOn 'externalNativeBuildRelease'
    }
}


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    api project(':rtplibrary')

    // Edge
    implementation 'com.obsez.android.lib.filechooser:filechooser:1.1.19'
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'

    // ARCore
    implementation 'de.javagl:obj:0.3.0'
    implementation 'com.google.ar:core:1.9.0'
}

这是第二个;

// 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.6.3'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

4

1 回答 1

2

如果我的假设是正确的,错误消息实际上是“预期的 NDK STL 共享对象”(带有大写的“NDK”和“STL”),那么这个错误来自 android gradle 插件:

https://android.googlesource.com/platform/tools/base/+/refs/heads/studio-master-dev/build-system/gradle-core/src/main/java/com/android/build/gradle/内部/ndk/NdkR19Info.kt#31

没有NdkR18Info。libstdc++ 和 stlport 支持在r18中被删除,而不是 r19。这可以通过使用 AGP 3.6 和 NDK r18 轻松重现:

* What went wrong:
Execution failed for task ':app:generateJsonModelArm8Debug'.
> Expected NDK STL shared object file at /usr/local/google/home/danalbert/Android/Sdk/ndk/18.1.5063045/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_shared.so

这只是 AGP 3.6(或更高版本)和 NDK r18 组合中的一个错误。你不能同时使用它们。最简单的解决方法是更新您的 NDK(无论如何,r18 现在已经很老了;r21b 是最新的)。添加ndkVersion "21.1.6352462"android你的 build.gradle 块就可以了。

我已经发送了一个补丁来修复这个错误,但鉴于没有人在此之前报告过这个问题,因此很难说它的影响足以保证向后移植。我会看看我是否至少可以把它变成 4.0 和/或 4.1。

于 2020-05-11T20:19:13.220 回答