将.so文件添加到Android Studio中的jniLibs:在打包APK期间重复文件

时间:2014-06-20 15:08:16

标签: android opencv android-studio

遵循各种说明,似乎我应该将本地库添加到app/src/main/jniLibs,并且它们将自动链接起来。但是,当我这样做时(对于OpenCV),我得到以下内容:

Error:duplicate files during packaging of APK /.../app/build/outputs/apk/app-debug-unaligned.apk
    Path in archive: lib/armeabi/libopencv_java.so
    Origin 1: /.../app/src/main/jniLibs/armeabi/libopencv_java.so
    Origin 2: /.../build/intermediates/exploded-aar/AppName/.libraries/opencv/unspecified/jni/armeabi/libopencv_java.so
You can ignore those files in your build.gradle:
    android {
      packagingOptions {
        exclude 'lib/armeabi/libopencv_java.so'
      }
    }
Error:Execution failed for task ':app:packageDebug'.
> Duplicate files copied in APK lib/armeabi/libopencv_java.so
    File 1: /.../app/src/main/jniLibs/armeabi/libopencv_java.so
    File 2: /.../app/src/main/jniLibs/armeabi/libopencv_java.so

添加exclude部分不起作用。这个文件只有一个副本,但不知怎的,它被引用了两次,似乎第二个(build)包含是自动生成的。我该怎么办?

3 个答案:

答案 0 :(得分:5)

如果存在重复的库(* .so)文件,则排除选项将无济于事,因为我们无法完全排除本机二进制文件。 packagingOptions还有一个选项。这是第一次选择。我们可以避免重复文件错误,并包含编译器遇到的第一个错误。

packagingOptions {    
    pickFirst 'lib/armeabi/libopencv_java.so'
}

答案 1 :(得分:1)

ndk-build正在生成OpenCV所有软件包的副本。除了我的实际应用程序库之外,我从我的应用程序中删除了所有.so库,然后打包完好。

答案 2 :(得分:0)

我也遇到过这个问题。这似乎是因为设置OpenCV for Android的文档和各种会话线程说将JNI库放在路径/ src / main / jniLibs或/ src / main / libs中。问题是/ src /文件夹是源代码而不是库。解决方案是将/ main /文件夹移出/ src /并进入项目根目录,这就是Google记录此项目结构的方式:https://developer.android.com/tools/projects/index.html

我在build.gradle中也有以下设置:

android {
    sourceSets {
        main {
            jni.srcDirs = [] //disable automatic ndk-build call
            jniLibs.srcDir 'main/libs'
        }
    }
}