Найдено несколько файлов с независимым от ОС путем «lib / armeabi-v7a / libarcore_sdk_jni.so» - PullRequest
0 голосов
/ 21 ноября 2019

Я знаю, что есть несколько похожих вопросов по SO, но он не работает для меня ...

Я создал Android lib, который использует ArCore. Это был вопрос о том, как не включать .so файл, если я использую созданный ndk lib? Есть также один ответ, который звучит правильно

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'
}

а также этот packageOptions {exclude 'lib / arm64-v8a / libarcore_sdk_jni.so' exclude 'lib / armeabi-v7a / libarcore_sdk_jni.so' exclude 'lib / x86 / libarcore_sdk_jni.so' exclude 'lib / x86_64.jar_jore_jore_core

Ничего не помогло.

Насколько я понимаю, проблема в том, что у меня есть одна копия arcore.so файлов в моем jniLibs каталоге и одна копия, созданная после Build здесь

enter image description here

Итак, как это исправить?

1 Ответ

1 голос
/ 21 ноября 2019

Вы, вероятно, добавили общие .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 в любом случае неправильный подход, когда компоновщик уже не знает, какой из них связать.

...