8

我正在使用带有JDK1.8版本的Windows10,eclipse-neon,我收到以下异常。

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutil
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.bytedeco.javacpp.Loader.load(Loader.java:385)
at org.bytedeco.javacpp.Loader.load(Loader.java:353)
at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2719)
at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:391)
at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:385)
at com.segment.processor.AudioMain.main(ApacheMathAudioMain.java:20)
Error getting static method ID of org/bytedeco/javacpp/Loader/putMemberOffset

这是我在 pom.xml 中使用的依赖项

    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco.javacpp-presets</groupId>
        <artifactId>ffmpeg</artifactId>
        <version>3.0.2-1.2</version>
    </dependency>

    <dependency>
        <groupId>org.bytedeco.javacpp-presets</groupId>
        <artifactId>opencv</artifactId>
        <version>3.1.0-1.2</version>
    </dependency>

    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacpp</artifactId>
        <version>0.10</version>
    </dependency>
4

4 回答 4

12

第一个问题

你的版本不匹配。org.bytedeco.javacppin 版本0.10是从2014 年 12 月开始的,而所有其他版本都是从2016 年 5 月开始的。您需要使用 的版本1.2org.bytedeco.javacpp或者更好的是,将所有依赖项更新到最新版本。

您可以在此处查看版本:

org.bytedeco.javacpp-presets » opencv

org.bytedeco.javacpp-presets » ffmpeg

org.bytedeco » javacv

org.bytedeco » javacpp

第二个问题

您仅包含 Java 代码的依赖项,但不包含本机代码的依赖项(opencv 和 ffmpeg 都是本机库)。您需要包括opencv-platformffmpeg-platform而不是:

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacpp</artifactId>
    <version>1.4.1</version>
</dependency>
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.4.1</version>
</dependency>
<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>opencv-platform</artifactId>
    <version>3.4.1-1.4.1</version>
</dependency>
<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>ffmpeg-platform</artifactId>
    <version>3.4.2-1.4.1</version>
</dependency>

这将使 Maven 下载并包含适用于 Android、Linux、MacOS 和 Windows(x86 和 x64)的 opencv 和 ffmpeg 库。

于 2018-04-19T10:30:28.330 回答
2

java.lang.NoClassDefFoundError:无法初始化类 org.bytedeco.javacpp.avutil

错误的实际原因是依赖项的不同版本。这就是javacpp包在类映射期间失败的原因。

请按照以下步骤解决此问题:

  • 从这里下载最新版本的 Javacv 库包
  • 将这三个.jar文件复制到libs文件夹中

    • ffmpeg.jar
    • javacv.jar
    • javacpp.jar
  • 在中创建jniLibs文件夹app\src\main

  • 现在,为不同的架构创建四个不同的文件夹

    • arm64-v8a
    • armeabi
    • armeabi-v7a
    • x86
  • 更改这两个文件ffmpeg-android-arm.jar, ffmpeg-android-x86.jar的扩展名,.zip然后解压缩两个文件夹并.so为每个体系结构复制文件并粘贴到其受尊重的目录中。你的结果目录应该是这样的

  • 项目清单

  • 在您的 gradle 文件中添加.jar依赖项,如下所示:

    implementation files('libs/ffmpeg.jar')
    implementation files('libs/javacpp.jar')
    implementation files('libs/javacv.jar')```
    

谢谢阅读 :)

于 2019-11-08T13:21:30.770 回答
0

这意味着该类在编译时存在,但在运行时缺失。你有几个选择:

  • 始终使用 Maven 插件执行。

  • 运行时将库包含在类路径中。

  • 使用 Maven Shade 插件制作一个包含依赖项的 Uber-Jar。

我希望这有帮助!

于 2018-04-25T20:34:26.397 回答