我有以下idl结构。我想用opendds发布它
#pragma DCPS_DATA_TYPE "B::CData"
#pragma DCPS_DATA_KEY "B::CData id"
module B {
struct Quote {
string skit_name;
string episode_name;
string line;
};
struct CData{
long id;
Quote payload;
};
};
我在java中编写了发布者和订阅者。但是在发布和订阅上述主题时JVM崩溃了。
有人对此有所了解吗?
以下是公共主题
的java代码 public static void main(String[] args) {
DomainParticipantFactory dpf =
TheParticipantFactory.WithArgs(new StringSeqHolder(args));
if (dpf == null) {
System.err.println ("Domain Participant Factory not found");
return;
}
final int DOMAIN_ID = 42;
DomainParticipant dp = dpf.create_participant(DOMAIN_ID,
PARTICIPANT_QOS_DEFAULT.get(), null, DEFAULT_STATUS_MASK.value);
if (dp == null) {
System.err.println ("Domain Participant creation failed");
return;
}
CDataTypeSupportImpl servant = new CDataTypeSupportImpl();
if (servant.register_type(dp, "") != RETCODE_OK.value) {
System.err.println ("register_type failed");
return;
}
Topic top = dp.create_topic("data",
servant.get_type_name(),
TOPIC_QOS_DEFAULT.get(), null,
DEFAULT_STATUS_MASK.value);
Publisher pub = dp.create_publisher(
PUBLISHER_QOS_DEFAULT.get(),
null,
DEFAULT_STATUS_MASK.value);
DataWriter dw = pub.create_datawriter(
top, DATAWRITER_QOS_DEFAULT.get(), null, DEFAULT_STATUS_MASK.value);
CDataDataWriter mdw = CDataDataWriterHelper.narrow(dw);
CData cData=new CData();
int handle = mdw.register(cData);
// above statement crashes the jvm
int ret = mdw.write(msg, handle);
}
答案 0 :(得分:0)
您可以使用openDDS传递复杂结构
您需要定义复杂的结构idl,如
#pragma DCPS_DATA_TYPE "B::CData"
module B {
typedef struct Quote {
string skit_name;
string episode_name;
string line;
}QuoteData;
struct CData{
long id;
QuoteData payload;
};
};
在接收数据时,您需要为复杂数据类型预先分配内存。如果CData
和QuoteData
首先我们将为QuoteData
分配内存,然后为{{分配内存1}}。
就我而言,我在Java中使用openDDS。 JAVA中的openDDS使用在编译openDDS和ACEWrappers后生成的本机库iedll或lib。
JVM崩溃是因为我没有为复杂对象预先分配内存。我只传递了CData对象。当我第一次创建QuoteData对象时,之后我创建了CData对象,它工作正常。