【问题标题】:More than one file was found with OS independent path 'lib/armeabi-v7a/libarcore_sdk_jni.so'找到多个文件,其独立于操作系统的路径为“lib/armeabi-v7a/libarcore_sdk_jni.so”
【发布时间】:2019-11-21 07:18:56
【问题描述】:

我知道关于 SO 有一些类似的问题,但它对我不起作用...

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

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

但是在我将libarcore.so 文件放在我的jniLib 下之后

我遇到了这样的错误

发现多个文件具有独立于操作系统的路径“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' }

没有任何帮助。

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

那么,如何解决呢?

【问题讨论】:

    标签: android gradle dependencies arcore


    【解决方案1】:

    您可能已添加共享的.so 文件从源代码构建(或以其他方式引用它们)。

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

    通常可以在build.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)
        }
    }
    

    如果配置不正确,此类 Gradle 任务也可能是重复的原因。 packagingOptions 在任何情况下都是错误的方法,因为链接器已经不知道要链接哪个。

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多