我一直试图在我的安卓应用程序中把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,我就不能这么做了。
这里可能是什么问题?
EDIT.我有两个不同的build.gradle。
我有两个不同的 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
}
如果我的假设是对的,错误信息实际上是 "Expected NDK STL shared object"(大写的 "NDK "和 "STL"),这个错误来自android gradle插件。
没有 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
的块中就可以了。
我已经发了一个补丁来修复这个bug,但是由于之前没有人报告过这个问题,所以很难说这个问题的影响足够大,需要进行回溯。我会看看是否至少能把它放到 4.0 或 4.1 中。