我有一个 Java 代码,它通过 JNI 调用本机 C++ 代码。今天,由 C++ 代码生成的结果以 XML 字符串的形式返回。
我想用 Protocol Buffers 对象替换它。
现在,在生成 PB 对象后,我有两个选择:
- 将其序列化为字符串并返回
- 尝试并返回对象本身。
有没有人尝试过第二种选择?它会起作用吗?它有什么潜在的问题吗?
谢谢。
我有一个 Java 代码,它通过 JNI 调用本机 C++ 代码。今天,由 C++ 代码生成的结果以 XML 字符串的形式返回。
我想用 Protocol Buffers 对象替换它。
现在,在生成 PB 对象后,我有两个选择:
有没有人尝试过第二种选择?它会起作用吗?它有什么潜在的问题吗?
谢谢。
您的问题对“协议缓冲区对象”的含义有些不清楚。我假设您的意思是消息对象,由.proto文件生成protoc
。那我敢说不行。虽然 PB序列化形式确实是跨平台和跨语言的,但实现不是。由于 JNI 提供了大量的 C 函数,您可以在 C(++) 中调用 Java 对象的方法,但没有反向接口可以从 Java 中执行相同的操作(在 C++ 对象上)。
但无论如何,PB 对象只不过是一个检测结构。该检测仅对 PB 序列化有用。如果你不使用序列化,PB 对你来说根本没用。如果您的 XML 至少具有某种稳定的结构(PB 无论如何都不会适应未知的结构),您为什么不将它反映在普通的 Java 对象中,通过 JNI 在 C++ 端传递它并在那里填充,使用提到的所有 JNI 函数?
是的,必须序列化一个对象SerializeToArray(..)
并将字节作为字节数组或缓冲区传递。看看它是如何工作的。