我有下面的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);
}发布于 2014-11-28 20:50:50
可以使用openDDS传递复杂的结构
您需要像这样定义复杂的结构idl
module B {
typedef struct Quote {
string skit_name;
string episode_name;
string line;
} QuoteData;
@topic
struct CData {
@key long id;
QuoteData payload;
};
};在接收数据时,您需要为复杂的data type.In情况预先分配内存
和
首先,我们将为以下对象分配内存
然后为其分配内存
..。
在我的例子中,我使用的是Java语言中的openDDS。Java语言中的openDDS使用本地库i.e.dll或lib,这些库是在编译openDDS和ACEWrappers之后生成的。
因为我没有为复杂的对象预先分配内存,所以JVM崩溃了。我只传递了CData对象。当我第一次创建QuoteData对象时,之后又创建了CData对象,它工作得很好。
https://stackoverflow.com/questions/26278422
复制相似问题