遵循各种说明,似乎我应该将本地库添加到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
)包含是自动生成的。我该怎么办?
答案 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'
}
}
}