android - APK打包过程中文件重复或Android UnsatisfiedLinkError

标签 android gradle android-ndk android-gradle-plugin

我有一个 Android 项目,它使用具有相互依赖关系的库:

Android 应用程序依赖于以下原生库

  • 模块 tess-2(包含 tesseract 和 leptonica)
  • 模块 opencv4android
  • 模块库

  • mylibrary 也依赖于 tess-two 和 opencv4android

    以下是我的 Android 应用程序的 build.gradle 文件:
    apply plugin: 'com.android.application'
    
    dependencies {
        compile fileTree(include: '*.jar', dir: 'libs')
        compile project(':libraries:opencv4android')
        compile project(':libraries:tess-two')
        compile project(':libraries:mylibrary')
    }
    
    android {
        compileSdkVersion 19
        buildToolsVersion "22.0.1"
    
    
        defaultConfig {
            minSdkVersion 14
            targetSdkVersion 19
        }
    
    //    packagingOptions {
    //        exclude 'lib/armeabi/liblept.so'
    //        exclude 'lib/armeabi/libtess.so'
    //        exclude 'lib/armeabi-v7a/liblept.so'
    //        exclude 'lib/armeabi-v7a/libtess.so'
    //        exclude 'lib/mips/liblept.so'
    //        exclude 'lib/mips/libtess.so'
    //        exclude 'lib/x86/liblept.so'
    //        exclude 'lib/x86/libtess.so'
    //    }
    
        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }
    
            instrumentTest.setRoot('tests')
            debug.setRoot('build-types/debug')
            release.setRoot('build-types/release')
        }
    }
    

    在此配置上构建 gradle 失败并显示 duplicate files during packaging of APK由于 liblept.so 导致的错误和 libtess.so被复制两次。

    但是,当我取消注释我可以成功构建的打包选项时,我得到一个 UnsatisfiedLinkError在运行时自 liblept.solibtess.so根本不包含在apk中。

    我怎样才能得到liblept.solibtess.so只包含在 apk 中一次?

    最佳答案

    我想我找到了解决方案,但是,我不太明白。
    build.gradle两个模块 mylibrary 和 tess-two 的文件都包含一个定义

    android.sourceSets.main.jniLibs.srcDirs = ['libs']



    在 tess-two 中评论这个定义导致 libtess.soliblept.so仅被复制到 apk 一次。

    如果有人理解此解决方案,请发表评论或回答。

    编辑:

    与此同时,我找到了一个更好的解决方案:
    我将以下代码添加到我的主要应用程序 gradle.build 文件中:
    packagingOptions { // otherwise libtess.so and liblept.so are copied to apk twice resulting in an error
        pickFirst('lib/*/liblept.so')
        pickFirst('lib/*/libtess.so')
    }
    

    关于android - APK打包过程中文件重复或Android UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34155345/

    相关文章:

    maven - 找不到 io.confluent :kafka-protobuf-serializer:6. 0.0

    安卓NDK : unused import statement with header file

    android - 在 Gradle 中指定 toolchainVersion 和 productFlavors

    java - Android 中抛出异常的序列化

    java - Android Studio : How to resize an image before uploading to server?

    macos - 无法本地化从 Homebrew 软件安装的android-ndk

    gradle - 如何在 Gradle Kotlin DSL 中使用类型安全的额外属性

    makefile - 如何在Android.mk文件中制作for循环

    android - android中的动态相对布局

    安卓 :getVisibility() error