2015-12-08 5 views
1

У меня есть Android проект, который использует библиотеки с взаимозависимостями:Дубликатов файлов во время упаковки APK или UnsatisfiedLinkError Android

Android приложений зависят от следующих нативных библиотек

  • модуля тесс-два (содержащий Тессеракт и leptonica)
  • модуль opencv4android
  • модуль MyLibrary

MyLibrary также зависит от Tess-два и opencv4android

Ниже приводится build.gradle файл моего приложения Android:

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.so и libtess.so не содержатся в APK вообще.

Как я могу получить liblept.so и libtess.so для включения в apk ровно один раз?

ответ

0

Я думаю, что нашел решение, однако, я не совсем понимаю его.

The build.gradle файлов обоих модулей MyLibrary и Тесс-два содержал определение

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

Комментируя это определение tess-two привел к тому, что libtess.so и liblept.so копируются в apk только один раз.

Если кто-то понимает это решение, оставьте комментарий или ответ.

Edit:

В то же время я нашел лучшее решение: я добавил следующий код в моих основных приложений 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') 
} 
Смежные вопросы