我应该如何从JNI调用中回传大型二进制结果?

时间:2011-10-09 00:07:46

标签: java servlets java-native-interface

我在Java和一些C代码之间进行IPC只是创建一个外部C进程,它接受一些命令行参数并将其结果写入标准输出。这是在服务器应用程序中,因此返回的数据需要直接反馈到HttpServletResponse的OutputStream中,我目前正在使用简单的Apache commons IOUtils.copy(inputStream, outputStream)。当前的解决方案是方便的,因为外部过程可以产生任意大的响应而不消耗任意量的存储器。不幸的是,产生外部过程的成本以及实际过程逻辑所需的所有设置使得开销对于小型作业来说是不可接受的。所以我想切换到JNI,这将消除外部进程开销,并允许在服务器启动时静态执行这些任务的大部分设置。

但我现在想知道如何保持响应的当前流特性 - 我不是简单地让JNI调用返回一个字节数组甚至是ByteBuffer,因为我想保持内存使用上限和低。那么,有哪些技术可用于调用C逻辑并以一种方式返回基本上任意大的字节数组,这样我就可以将它们放入OutputStream中而不会消耗任意大量的内存,并且没有太多开销来设置C环境。

FWIW,这个C代码基本上是在一堆记录上运行Lua脚本,并返回每条记录的输出。

首先想到的是将OutputStream传递给本机方法,并在C代码生成响应时间歇性地使用JNI反射调用write。我有没有更好的选择?文件? Zeromq?

1 个答案:

答案 0 :(得分:1)

你可以让你的JNI方法返回一个带有读回调进入JNI的InputStream,但我认为如你所建议的那样将OutputStream传递给JNI是一个更清晰的解决方案。