有没有人试图通过 JNI 将 protobuf 对象从 C++ 返回到 Java

Has anyone tried to return a protobuf object from C++ to Java through JNI?

本文关键字:对象 C++ 返回 Java protobuf 没有人 JNI      更新时间:2023-10-16

我有一个Java代码,它通过JNI调用本机C++代码。今天,C++代码生成的结果以 XML 字符串的形式返回。

我想用协议缓冲区对象替换它。

现在,在生成 PB 对象后,我有两个选择:

  • 将其序列化为字符串并返回
  • 尝试返回对象本身。

有没有人尝试过第二种选择?会起作用吗?有什么潜在的问题吗?

谢谢。

您的问题对于"协议缓冲区对象"的含义有些不清楚。我假设你的意思是消息对象,由 protoc.proto 文件生成。那我敢说行不通。虽然 PB 序列化形式确实是跨平台和跨语言的,但实现不是。虽然由于 JNI 提供了大量 C 函数,您可以在 C(++) 中对 Java 对象调用方法,但没有反向接口可以从 Java (在 C++ 对象上)执行相同的操作。

但无论如何,PB 对象只不过是一个检测的结构。检测仅对 PB 序列化有用。如果您不使用序列化,PB 对您来说基本上毫无用处。如果你的XML至少有一些稳定的结构(PB无论如何都不会容纳unkown结构),为什么不在普通Java对象中反映它,在JNI上C++端传递它,然后在那里填充,使用提到的所有JNI函数?

是的,必须使用 SerializeToArray(..) 序列化对象并将字节作为字节数组或缓冲区传递。在此处查看其工作原理。