通过命令行与JNI进行调用

时间:2009-01-23 05:06:16

标签: java java-native-interface ocr tesseract

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

  1. 将当前保存在内存中的图像保存到文件(a .tif)
  2. 将图像文件名传递给tesseract命令行程序。
  3. 使用FileReader从Java读取输出文本文件。
  4. 通过为Tesseract编写JNI包装器,我可以获得多少性能提升?不幸的是,没有一个可在Linux中运行的开源JNI包装器。我必须自己做,并且想知道这个好处是否值得开发成本。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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