【问题标题】:java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutiljava.lang.NoClassDefFoundError:无法初始化类 org.bytedeco.javacpp.avutil
【发布时间】:2023-03-30 18:40:01
【问题描述】:

我用的是windows10,eclipse-neon JDK1.8版本, 我收到以下异常。

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>

【问题讨论】:

  • 我建议使用具有良好 Java 包装器的 OpenCV 而不是 JavaCV。
  • 检查 jar 文件以查看它们是否包含类,例如 jar tf [jarfile] | grep org.bytedeco.javacpp.avutil
  • 删除了 JavaCV 并使用了 OpenCV 依赖项,但仍然得到相同的异常
  • 我已经打开了所有可用的 jar,例如 javacpp-0.10, javacpp-1.2.2, opencv-3.1.0-1.2, javacv-1.1 等,但没有一个包含 avutil 类。它实际上在哪里可用.. 我的意思是在哪个依赖项中
  • 将此依赖更新为 org.bytedecojavacpp0.10 1.4.1。

标签: java javacv javacpp


【解决方案1】:

第一个问题

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

您可以在此处查看版本:

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 库。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

      • 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')```
      

    感谢阅读:)

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      这意味着该类在编译时存在,但在运行时缺失。您有两种选择:

      • 始终使用 Maven 插件执行。

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

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

      我希望这会有所帮助!

      【讨论】:

      • 我很抱歉否决了您的回答,因为我不想阻止新用户为平台做出贡献,但在这种特殊情况下,您的回答很遗憾是错误的。 Java 类肯定存在,它只是无法被 JVM 初始化,因为它依赖于本地代码,并且本地代码没有作为依赖项包含在内。
      • 感谢您的指正!你怎么知道依赖依赖于原生代码?
      • 因为它可以?它是本机代码的直接包装器。看看source
      猜你喜欢
      • 2021-09-10
      • 2012-10-10
      • 1970-01-01
      • 2013-08-08
      • 2020-09-27
      • 2012-08-26
      • 2015-10-29
      • 2017-09-12
      相关资源
      最近更新 更多