我有一个 Android 项目,它使用具有相互依赖关系的库:
Android 应用程序依赖于以下原生库
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.so
和 libtess.so
根本不包含在apk中。我怎样才能得到
liblept.so
和 libtess.so
只包含在 apk 中一次?
最佳答案
我想我找到了解决方案,但是,我不太明白。build.gradle
两个模块 mylibrary 和 tess-two 的文件都包含一个定义
android.sourceSets.main.jniLibs.srcDirs = ['libs']
在 tess-two 中评论这个定义导致
libtess.so
和 liblept.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/