首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JNI有效地将GPB序列化数据从Java传递到C++

使用JNI有效地将GPB序列化数据从Java传递到C++
EN

Stack Overflow用户
提问于 2014-02-27 07:42:28
回答 1查看 1.3K关注 0票数 2

这些天来,我正在寻找一种将复杂的数据结构从Java传递到本地(C++) dll的方法,反之亦然。在阅读了许多关于JNI及其开销的文章之后,我开始寻找一种有效的方法来序列化Java/本机端的数据,并将其作为一块数据传递给另一方。这样,可以保存许多JNI调用。目前,我使用Google缓冲区来序列化许多复杂的类,并通过单个JNI调用将这些数据传递给本机层。看起来不错。例如,Java端4000个小类的序列化、JNI调用和本机端的反序列化在i7上占用了1.6ms。

java端的序列化是通过调用GPB_GENERATED_CLASS.build.toByteArray()来完成的,这实际上是在每次调用时创建一个新的字节数组。之后,使用ByteBuffer ()()函数将数组数据复制到直接中。

Google缓冲区序列化程序提供了另一个功能,可以将序列化的数据写入OutputStream。

我的问题是:

  1. 有没有一种方法可以将序列化的数据传递给JNI (本机),而不需要copiyng并在每次调用中创建新对象?
  2. 是否有方法分配ByteArrays或DirectByteBuffers一次,并使用它们将数据从Java传递给JNI,反之亦然(使用OutputStream?)
  3. 任何其他可能提高性能和保存垃圾选择操作的提示都将非常受欢迎。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-27 13:06:57

Google缓冲器(GPB)消息实现还提供了一个writeTo方法。

ByteArrayOutputStream非常接近您所要寻找的内容,但是,每当您访问内部字节数组时,它都会创建一个新副本,这听起来并不像您正在寻找的副本。但是,如果创建自己的OutputStream实现(类似于ByteArrayOutputStream ),则可以控制内部字节数组( DirectByteBuffer )的生命周期。这将使您能够提高性能和减少短期对象。

代码语言:javascript
复制
writeTo

void writeTo(OutputStream output)

序列化消息并将其写入输出。这只是writeTo(CodedOutputStream)的一个简单的包装器。这不会刷新或关闭流。 注意:协议缓冲区不是自定界的.因此,如果在消息之后将更多的数据写入流,则必须以某种方式确保接收端的解析器不会将其解释为协议消息的一部分。可以这样做,例如,在数据之前写入消息的大小,然后确保在接收端将输入限制在该大小(例如,将InputStream封装在一个限制输入的范围内)。或者,只使用writeDelimitedTo(OutputStream)。抛出: IOException抛出IOException

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22062124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档