【问题标题】:Invoking via command line versus JNI通过命令行调用与 JNI
【发布时间】:2009-01-23 05:06:15
【问题描述】:

我需要从 Java 应用程序服务器调用 tesseract OCR(它是 C++ 中的一个开源库,用于进行光学字符识别)。现在很容易使用 Runtime.exec() 运行可执行文件。基本逻辑是

  1. 将当前保存在内存中的图像保存到文件(.tif)
  2. 将图像文件名传递给 tesseract 命令行程序。
  3. 使用 FileReader 从 Java 读取输出文本文件。

通过为 Tesseract 编写 JNI 包装器,我可能会在性能方面获得多少改进?不幸的是,没有在 Linux 中工作的开源 JNI 包装器。我必须自己做,我想知道这样做的好处是否值得开发成本。

【问题讨论】:

  • 能否请您粘贴您在 Runtime.exec() 中使用的命令以运行 tesseract 命令。我猜不出来...

标签: java java-native-interface ocr tesseract


【解决方案1】:

很难说是否值得。如果您假设如果通过 JNI 在进程内完成,OCR 代码可以直接访问图像数据而无需将其写入文件,那么它肯定会消除那里的任何磁盘 I/O 限制。

我建议使用更简单的方法,并且仅在性能不可接受时才采用 JNI 选项。至少,您将能够进行一些基准测试并估计您可能实现的性能提升。

【讨论】:

    【解决方案2】:

    如果您确实追求自己的包装,我建议您查看JNA。它将允许您调用大多数只编写 Java 代码的“本机”库,并且会比原始 JNI 为您提供更多帮助以安全地执行此操作。 JNA 适用于大多数平台。

    【讨论】:

    • 感谢我没有听说过 JNA 的建议。我会为任何需要原生绑定的未来项目研究它。
    • 这里提到了另外两个映射库(JInvoke 和 Swig):stackoverflow.com/questions/1172486/is-there-a-market-for-jni
    • JNA 在 C++ 中表现不佳,而在 C 中表现不佳,而 Tesserect 已(大部分)迁移到 C++。
    • @Hovercraft - 这是一个很好的观点,我没有考虑这个案例。 JNA 非常方便,但并非适用于所有应用程序。
    【解决方案3】:

    我同意tweakt。如果没有性能原因,请不要使用 JNI。如果您使用 JNI 调用,如果您的 JNI 层或 OCR 本身存在一些内存泄漏甚至崩溃的可能性,您的应用程序稳定性也可能会受到威胁。如果您通过命令行界面使用它,则永远不会发生这种情况(所有内存将在程序退出时释放,所有异常程序终止都可以在调用者代码中检查)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多