一起使用JavaCV和Realm会导致“java.lang.UnsatisfiedLinkError”

我最近试图启动一个JavaCV的FFmpegFrameGrabber的实例,得到以下错误:

java.lang.UnsatisfiedLinkError: org.bytedeco.javacpp.avutil at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:324) at org.bytedeco.javacpp.Loader.load(Loader.java:413) at org.bytedeco.javacpp.Loader.load(Loader.java:381) at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2597) at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:386) at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:380)... 

虽然存在解决这个问题的方法,但是没有人为我工作。

通过很多试验,我发现这个奇怪的是,如果我的项目中没有包括Realm,我不会再收到这个错误。

下面是我的build.gradle文件的一部分,其中包含了所有这些库:

 compile group: 'org.bytedeco', name: 'javacv', version: '1.1' compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.0.0-1.1', classifier: 'android-arm' compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.0.0-1.1', classifier: 'android-x86' compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.8.1-1.1', classifier: 'android-arm' compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.8.1-1.1', classifier: 'android-x86' // ORM compile 'io.realm:realm-android:0.87.2' // Tested NOT OK - Causes JavaCV to crash // 

我在想这个问题可能是我不知道的。 我在互联网上没有发现任何关于图书馆不兼容或为什么会出现这种行为的情况。

我将编辑这个职位,任何人都可能需要的额外的细节。

任何帮助将不胜感激。

编辑

我试图应用这里描述的修复。 现在我的包装选项如下所示:

 packagingOptions { exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties' exclude 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml' exclude 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties' exclude 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml' exclude "lib/arm64-v8a/librealm-jni.so" } 

不幸的是,这个变化没有效果。 我仍然坚持。

在我的一个同事的帮助下,我已经能够解决这个问题。

除了问题中描述的步骤外,我们还:

  • 复制了app / src / main / jniLibs / armeabiapp / src / main / jniLibs / armeabi-v7a文件夹中的所有.so文件
  • 添加

    ndk {abiFilters“armeabi-v7a”}

    到模块的build.gradle文件的defaultConfig部分

  • 添加

    lintOptions {abortOnError false}

    到模块的build.gradle文件的android部分

如果可以的话,我会尽力向需要的人提供进一步的说明。

首先,这个问题是由于Gradle不能正确parsingmaven profile中的依赖关系而造成的。在我的情况下,只有x86版本的depdendecies被发送到了APK。 这意味着上面的代码只适用于x86 CPU架构。 解决scheme应该在Android Studio上完成。 但作为解决方法,我做到了这一点:

  1. 下载二进制javacv-platform-1.3.1-bin.zip 。 它来自: https : //github.com/bytedeco/javacv
  2. 内部目录javacv-bin将这些jar复制到新目录

    1. ffmpeg的,Android的arm.jar
    2. OpenCV的,Android的arm.jar
    3. ffmpeg的,Android的x86.jar
    4. OpenCV的,Android的x86.jar
  3. 对于2.1 2.2文件,提取这些瓶子,然后去libarmeabi 。 然后将所有*.so文件复制到您的项目下:

    1. app/src/main/jniLibs/armeabi/
    2. app/src/main/jniLibs/armeabi-v7a/
  4. 您可以通过将依赖关系复制到app/src/main/jniLibs/x86/来执行与2.3 * 2.4 jar相同的操作。 只是检查你的apk如果它真的没有他们。

而已。