在Java中使用带有SWIG的std :: vector

时间:2018-06-07 13:47:34

标签: java c++ vector swig pjsip

我对这个SWIG事物的新手以及Java和C ++之间的交互。 我正在尝试使用Java包装的pjsip库。

我在名为" call.hpp":

的文件中有以下结构
/**
 * This structure contains parameters for Call::onCreateMediaTransportSrtp()
 * callback.
 */
struct OnCreateMediaTransportSrtpParam
{
    /**
     * The media index in the SDP for which the SRTP media transport
     * will be used.
     */
    unsigned                mediaIdx;

    /**
     * Specify whether secure media transport should be used. Application
     * can modify this only for initial INVITE.
     * Valid values are PJMEDIA_SRTP_DISABLED, PJMEDIA_SRTP_OPTIONAL, and
     * PJMEDIA_SRTP_MANDATORY.
     */
    pjmedia_srtp_use        srtpUse;

    /**
     * Application can modify this to specify the cryptos and keys
     * which are going to be used.
     */
    vector<SrtpCrypto>      cryptos;
};

现在,这个函数的Java包装器看起来如何(我省略了一些getter和setter来减少长度):

package org.pjsip.pjsua2;

public class OnCreateMediaTransportSrtpParam {
  private transient long swigCPtr;
  protected transient boolean swigCMemOwn;

  protected OnCreateMediaTransportSrtpParam(long cPtr, boolean cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = cPtr;
  }

  protected static long getCPtr(OnCreateMediaTransportSrtpParam obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }

  protected void finalize() {
    delete();
  }

  public synchronized void delete() {
    if (swigCPtr != 0) {
      if (swigCMemOwn) {
        swigCMemOwn = false;
        pjsua2JNI.delete_OnCreateMediaTransportSrtpParam(swigCPtr);
      }
      swigCPtr = 0;
    }
  }

  public void setCryptos(SWIGTYPE_p_vectorT_pj__SrtpCrypto_t value) {
    pjsua2JNI.OnCreateMediaTransportSrtpParam_cryptos_set(swigCPtr, this, SWIGTYPE_p_vectorT_pj__SrtpCrypto_t.getCPtr(value));
  }

  public SWIGTYPE_p_vectorT_pj__SrtpCrypto_t getCryptos() {
    long cPtr = pjsua2JNI.OnCreateMediaTransportSrtpParam_cryptos_get(swigCPtr, this);
    return (cPtr == 0) ? null : new SWIGTYPE_p_vectorT_pj__SrtpCrypto_t(cPtr, false);
  }

  public OnCreateMediaTransportSrtpParam() {
    this(pjsua2JNI.new_OnCreateMediaTransportSrtpParam(), true);
  }

}

现在,我不知道如何在参数中使用带有SWIGTYPE_p_vectorT_pj__SrtpCrypto_t类型的setCryptos。 我尝试了以下方法:

SrtpCrypto crypto = new SrtpCrypto();
crypto.setName("AES_CM_128_HMAC_SHA1_80");
OnCreateMediaTransportSrtpParam prm = new OnCreateMediaTransportSrtpParam();
Vector<SrtpCrypto> cryptos = new Vector<SrtpCrypto>();
cryptos.add(crypto);
prm.setCryptos(cryptos);

但是我收到以下错误:

error: incompatible types: Vector<SrtpCrypto> cannot be converted to SWIGTYPE_p_vectorT_pj_SrtpCrypto_t

关于如何进行的任何想法? 非常感谢!!!

1 个答案:

答案 0 :(得分:0)

从您所显示的内容来看,SWIG所看到的类型与所使用的类型之间存在不匹配。

在call.hpp中你有:

vector<SrtpCrypto>

这里的这个向量几乎可以肯定是命名空间std中的一个,你已经告诉过SWIG要包装,但是由于某种类型的命名空间指令,你还没有看到它,SWIG没有这个问题。我们意识到它们属于同一类型,并使用默认的不透明类型而不是可互换的类型。

最简单的修复方法是将头文件更改为:

std::vector<SrtpCrypto>
相反,错误几乎肯定会消失。