【问题标题】:Is there a way using 2 different versions of the same lib, so files in android有没有办法使用同一个lib的2个不同版本,所以android中的文件
【发布时间】:2019-01-31 02:33:21
【问题描述】:

我有一个使用OpenCV 3.1 的应用程序。我将lib_opencv_java.so 文件复制到jniLibs 文件夹中。现在我想将一个新的 sdk 集成到我的应用程序中,但是这个 SDK 也使用了不同版本的 OpenCV。 SDK OpenCV 库随 Gradle 添加,未复制到 jni 文件夹。当我构建应用程序时,编译时间出错:

找到多个文件,其独立于操作系统的路径为“lib/arm64-v8a/libopencv_java3.so”

为了解决这个问题,我重命名了我的 OpenCV 并使用不同的名称重新生成了 .so 文件。之后,它没有给出上述问题,但是当我尝试打开使用 OpenCV 的活动时。应用程序因以下错误而崩溃:

java.lang.UnsatisfiedLinkError: dlopen failed: 找不到“/data/app/io.xxxxxx-gilxH9B4dAHGtuXtU4Sl6Q==/lib/arm64/libProcess.so”引用的符号“_ZN2cv7imwriteERKNS_6StringERKNS_11_InputArrayERKSt6vectorIiSaIiEE”。

【问题讨论】:

  • 尺寸很重要。您的用户不会很高兴发现您的应用程序已经增长了几兆字节只是为了存储两个版本的 so。让两个库都使用一个版本的 OpenCv 应该不是很难。
  • 是的,apk 大小会增加。但是我为什么要保留这两个库是因为我不想依赖第三方 sdk 的 opencv 版本。谢谢,我会尝试使用相同的。

标签: android android-studio android-ndk java-native-interface opencv3.1


【解决方案1】:

要正确摆脱以下错误:

找到多个文件,其独立于操作系统的路径为“lib/arm64-v8a/libopencv_java3.so”

您应该在app/build.gradle 中使用以下代码

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

【讨论】:

  • 感谢您的回答。我在配置 android 处理器架构库方面没有任何问题。它也对我有用。但我想解决的是,如果我在项目中有 2 个版本的 opencv。正如 Alex Cohn 评论的那样,我将尝试为第三方库和我的图像处理算法应用一个。
  • 没有必要包含相同 .so 库的两个版本,因为这个副本会大大增加您的最终 apk 大小。重命名任何一个都不是正确的解决方案。我的答案是让 gradle 在打包你的 apk 时只选择一个版本的库
  • 或者更简单的方法是从第三方删除opencv版本并包含你自己的。但请注意库版本的兼容性。
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2021-08-19
相关资源
最近更新 更多