一起使用JavaCV和Realm导致" java.lang.UnsatisfiedLinkError"

时间:2016-01-28 16:14:04

标签: java android realm javacv

我最近通过尝试启动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
//

我在想,我不知道可能有解决这个问题的方法。我发现网上任何地方都没有提到图书馆不兼容或者为什么会出现这种情况。

我将使用任何人可能需要的任何其他详细信息来编辑此帖子。

非常感谢任何帮助。

修改

我尝试应用here描述的修复程序。 现在我的包装选项如下所示:

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"
}

不幸的是,这种变化没有任何效果。我还是卡住了。

2 个答案:

答案 0 :(得分:6)

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

根据问题中描述的步骤,我们:

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

    ndk {         abiFilters“armeabi-v7a”     }

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

  • lintOptions {     abortOnError为false }

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

如果我能够的话,我会尽力向需要他们的人提供进一步的澄清。

答案 1 :(得分:0)

首先出现此问题是因为Gradle没有从maven配置文件中正确解析依赖关系。在我的情况下,只有x86 depdendecies发送到APK。这意味着上面的代码只适用于x86 cpu架构。解决方案应该在Android Studio上完成。但作为解决方法,我这样做了:

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

    1. 的ffmpeg-机器人-arm.jar
    2. 的OpenCV-机器人-arm.jar
    3. 的ffmpeg-机器人-x86.jar
    4. 的OpenCV-机器人-x86.jar
  3. 对于2.1 2.2文件,解压缩这些jar并转到 lib 然后转到 armeabi 。然后将所有*.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是否真的没有。
  5. 那就是它。