【问题标题】:Using javacpp-preset/tesseract crashes java on exit使用 javacpp-preset/tesseract 在退出时使 java 崩溃
【发布时间】:2015-12-06 20:43:53
【问题描述】:

我正在尝试使用 Tesseract 在 Java 应用程序中提供 OCR 功能。为此,我使用了here 找到的 Java/Tesseract 桥。

pom.xml 依赖:

<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>tesseract</artifactId>
    <version>3.04-1.1</version>
</dependency>

它有效,我可以使用该库对图像进行 OCR 化。但是当 Java 程序完成时,JVM 崩溃了。举一个最小的例子,即使是第一个 Tesseract 初始化行就足够了:

import org.bytedeco.javacpp.tesseract.TessBaseAPI;

public class MinimalExample {

    public static void main(String[] args) {
        System.out.println("Hi!");
        TessBaseAPI tessAPI = new TessBaseAPI();
    }
}

如果我运行这个main,它会给出以下信息:

Hi!

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

以及以下错误消息:Java(TM) Platform SE binary funktioniert nicht mehr – Windows kann online nach einer Lösung für das Problem suchen. (Java(TM) Platform SE binary does not work anymore – Windows can look for a solution to this problem online)。

Problemsignatur:
  Problemereignisname:  APPCRASH
  Anwendungsname:   java.exe
  Anwendungsversion:    8.0.650.17
  Anwendungszeitstempel:    5614685f
  Fehlermodulname:  libgcc_s_dw2-1.dll
  Fehlermodulversion:   0.0.0.0
  Fehlermodulzeitstempel:   3f263ec2
  Ausnahmecode: 40000015
  Ausnahmeoffset:   000149a1
  Betriebsystemversion: 6.1.7601.2.1.0.256.49
  Gebietsschema-ID: 1031
  Zusatzinformation 1:  7309
  Zusatzinformation 2:  73092f5dbc78923c702ae5601110d2ea
  Zusatzinformation 3:  9fa1
  Zusatzinformation 4:  9fa11625863fb37077a4ab55be352b96

我以前从未遇到过 Java 崩溃的情况——但我也从未使用过原生程序。 ;-) 有没有人暗示在哪里寻找这种奇怪行为的解决方案?

编辑 2015-12-07:使用 ListDLLs,我看到有问题的 DLL 位于 C:\Users\...\AppData\Local\Temp\javacpp3256864312633\libgcc_s_dw2-1.dll,因此“来自 %PATH% 的错误 DLL”不是回答。

【问题讨论】:

  • 看起来像 MSYS2 的问题:sourceforge.net/p/msys2/mailman/msys2-users/thread/… 听起来这在最新版本中已修复。需要重建才能找出答案。
  • @SamuelAudet:我理解正确吗,这意味着必须重新编译 Tesseract-Libraries 并且错误就在那里?
  • 看起来问题出在 C++ 运行时,我们可能需要重新构建。简单地用 MSYS2 的最新版本替换 libgcc_s_dw2-1.dll 也可能有效。
  • 哦,我现在才知道:Samiel Audet == saudet! ;) 我怎样才能替换 dll?它位于一个由 Maven 加载的 jar 中,我不知道应该如何在不牺牲整个 Maven 进程优势的情况下干扰该进程。
  • 好吧,在 Maven 之外尝试一下,如果可行,我们会想办法的。

标签: java tesseract javacpp libgcc


【解决方案1】:

可能是 libwinpthread-1.dll 有问题。

用最新的mingw32的dll替换jar中当前的libwinpthread-1.dll,就可以正常使用了。

  1. 安装从https://msys2.github.io/下载的msys2-x86_64-20150916.exe。
  2. 使用 pacman 安装 base-devel、mingw-w64-i686-toolchain。
  3. 提取 leptonica-1.72-1.1-windows-x86.jar,并将所有 dll 放入应用程序的同一文件夹中。
  4. 从类路径中删除 leptonica-1.72-1.1-windows-x86.jar。
  5. 从文件夹中删除 libwinpthread-1.dll(或将 libwinpthread-1.dll 替换为已安装的 C:\msys64\mingw32\bin\libwinpthread-1.dll)。 路径 "C:\msys64\mingw32\bin" 似乎是先加载的,所以如果可以安装 mingw32 ,则无需删除(或替换)它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多