首页 > 解决方案 > 使用 protobuf-cpp 作为 JNI 的依赖项时出错

问题描述

我正在使用libpg_queryScala。为此,我创建了一个使用 Protobuf 与库通信的 JNI API。不幸的是,由于libpg_query.

[libprotobuf ERROR google/protobuf/descriptor_database.cc:641] File already exists in database: protobuf/pg_query.proto
[libprotobuf FATAL google/protobuf/descriptor.cc:1371] CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): 
libc++abi.dylib: terminating with uncaught exception of type google::protobuf::FatalException: CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size):

这个错误似乎是众所周知的——通常是由将 Protobuf 生成的源双重链接到单个二进制文件引起的。这会导致生成的类重新初始化和二进制文件崩溃。

就我而言,这可能不是根本原因。我认为这是由于 JNI 库可以从不同的类加载器和 JVM 分支多次加载这一事实引起的——这有很多,因为我使用一个模块中内置的 JNI 函数作为后续执行的宏的一部分模块。

请问,有没有人知道如何descriptor_database初始化以及我是否可以防止错误在我的场景中发生?

标签: java-native-interfaceprotocol-buffersprotobuf-c

解决方案


推荐阅读