我知道在SO上也有一些类似的问题,但这对我不起作用...
我创建了使用ArCore的Android库。这是一个关于SO的问题,如果使用创建的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' }
没有任何帮助。
据我所知,问题是-我在arcore.so
目录下有jniLibs
个文件的一个副本,并在Build
之后创建了一个副本
那么,如何解决呢?
答案 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)
}
}
在每种情况下都是错误的方法。