使用操作系统独立路径'lib / armeabi-v7a / libarcore_sdk_jni.so'找到多个文件

时间:2019-11-21 07:18:56

标签: android gradle dependencies arcore

我知道在SO上也有一些类似的问题,但这对我不起作用...

我创建了使用ArCore的Android库。这是一个关于SO的问题,如果使用创建的ndk lib,如何不包含.so文件?还有一个听起来不错的答案

https://stackoverflow.com/a/58963852/5709159

但是在我将libarcore.so文件放在jniLib

之后

enter image description here

我遇到了这样的错误

  

使用操作系统独立路径'lib / armeabi-v7a / libarcore_sdk_jni.so'找到多个文件

所以,我试图通过这种方式修复它

https://stackoverflow.com/a/44962630/5709159

sourceSets.main {
        jniLibs.srcDir 'src/main/jniLibs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }

https://stackoverflow.com/a/56453718/5709159

packagingOptions {
    pickFirst 'src/main/jniLibs/arm64-v8a/libarcore_sdk_jni.so'
    pickFirst 'src/main/jniLibs/armeabi-v7a/libarcore_sdk_jni.so'
    pickFirst 'src/main/jniLibs/x86/libarcore_sdk_jni.so'
    pickFirst 'src/main/jniLibs/x86_64/libarcore_sdk_jni.so'
}

然后这个

packagingOptions {
    pickFirst 'lib/arm64-v8a/libarcore_sdk_jni.so'
    pickFirst 'lib/armeabi-v7a/libarcore_sdk_jni.so'
    pickFirst 'lib/x86/libarcore_sdk_jni.so'
    pickFirst 'lib/x86_64/libarcore_sdk_jni.so'
}

还有这个     包装选项{         排除'lib / arm64-v8a / libarcore_sdk_jni.so'         排除'lib / armeabi-v7a / libarcore_sdk_jni.so'         排除'lib / x86 / libarcore_sdk_jni.so'         排除'lib / x86_64 / libarcore_sdk_jni.so'     }

没有任何帮助。

据我所知,问题是-我在arcore.so目录下有jniLibs个文件的一个副本,并在Build之后创建了一个副本

enter image description here

那么,如何解决呢?

1 个答案:

答案 0 :(得分:1)

您可能已经添加了共享的.so文件,并且从源代码构建了(或另外引用了它们)。

一个人不能同时做这两个事情,因此您要么需要从source构建并删除那些.so文件-要么删除arcore-android-sdk模块并保留{{ 1}}个文件。 Java .so也可能会引入本机程序集,而dependencies的那一部分会丢失(只要在“外部库”中浏览AR核心,以查看其中包含的内容,以防其中存在)。使用预先构建的库通常可以更快地构建并节省时间-建议这样做,除非需要编辑build.gradle源。

通常可以在此build.gradle中提供类似的依赖项:

cpp

如果未正确配置,则此类Gradle任务也可能是重复项的原因。当链接器已经不知道要链接哪个链接器时,dependencies { implementation "com.google.ar:core:1.13.0" natives "com.google.ar:core:1.13.0" } // Extracts the shared libraries from aars in the natives configuration. // This is done so that NDK builds can access these libraries. task extractNativeLibraries() { // Always extract, this ensures the native libs are updated if the version changes. outputs.upToDateWhen { false } doFirst { configurations.natives.files.each { f -> copy { from zipTree(f) into arcore_libpath include "jni/**/*" } } } } tasks.whenTaskAdded { task-> if (task.name.contains("external") && !task.name.contains("Clean")) { task.dependsOn(extractNativeLibraries) } } 在每种情况下都是错误的方法。