打包APK或UnsatisfiedLinkError Android时复制文件

时间:2015-12-08 11:59:55

标签: android gradle android-ndk android-gradle

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

Android应用程序依赖于以下本机库

  • 模块tess-two(包含tesseract和leptonica)
  • module opencv4android
  • module mylibrary

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

由于duplicate files during packaging of APKliblept.so被复制两次,因此此配置的gradle构建失败,并显示libtess.so错误。

当我取消注释我可以成功构建的打包选项时,我在运行时得到UnsatisfiedLinkError,因为liblept.so并且libtess.so根本不包含在apk中。

如何才能将liblept.solibtess.so恰好包含在apk中?

1 个答案:

答案 0 :(得分:0)

我认为我找到了解决方案,但是,我不太了解它。

mylibrary和tess-two模块的build.gradle个文件包含

的定义
  

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