通过命令行与JNI进行调用

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

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

通过为Tesseract编写JNI包装器,我可以获得多少性能提升? 不幸的是,没有一个可在Linux中运行的开源JNI包装器。 我必须自己做,并且想知道这个好处是否值得开发成本。

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

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

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

我同意tweakt。 如果没有性能原因,请不要使用JNI。 如果您使用JNI调用,如果您的JNI层或OCR本身存在内存泄漏甚至崩溃的可能性,那么您的应用程序稳定性也可能存在危险。 如果您通过命令行界面使用它将永远不会发生(所有内存将在程序出口处释放,并且可以在调用者代码中检查所有exception程序终止)。