2

私は次の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);

}
4

1 に答える 1

0

openDDS を使用して複雑な構造を渡すことができます

次のような複雑な構造 idl を定義する必要があります

module B { 
  typedef struct Quote {
    string skit_name;
    string episode_name;     
    string line;
  } QuoteData;

  @topic
  struct CData {
    @key long id;
    QuoteData payload;
  };
};

データの受信中に、複雑なデータ型にメモリを事前に割り当てる必要があります。 の場合は CDataQuoteData最初に にメモリをQuoteData 割り当て、次に にメモリを割り当てますCData

私の場合、Java で openDDS を使用しています。JAVA の openDDS は、openDDS および ACEWrappers をコンパイルした後に生成されるネイティブ ライブラリ iedll または lib を使用します。

複雑なオブジェクトにメモリを事前に割り当てていないため、JVM がクラッシュしていました。CData オブジェクトのみを渡しています。最初に QuoteData オブジェクトを作成し、その後 CData オブジェクトを作成すると、正常に動作します。

于 2014-11-28T12:50:50.403 に答える