Использование std :: vector в Java с SWIG - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в этом SWIG и взаимодействии между Java и C ++.Я пытаюсь использовать библиотеку pjsip, обернутую с Java.

У меня есть следующая структура в файле с именем "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 для этогофункция выглядит следующим образом (я опустил некоторые методы получения и установки для уменьшения длины):

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);
  }

}

Теперь я не знаю, как использовать setCryptos с типом SWIGTYPE_p_vectorT_pj__SrtpCrypto_t в параметре.я пробую следующее:

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 голосов
/ 10 июня 2018

Из того, что вы показали, есть несоответствие между типами, которые видит SWIG, и используемыми типами.

В call.hpp у вас есть:

vector<SrtpCrypto>

Этот вектор почти наверняка является одним из пространства имен std, которое вы сказали SWIG обернуть, но здесь из-за некоторых директив пространства именпохоже, что вы не показали его, вопрос, который SWIG не осознал, что они одного типа, и вместо этого использовал непрозрачный тип по умолчанию, который не является взаимозаменяемым.

Самое простое решение - изменить заголовочный файл на:

std::vector<SrtpCrypto>

, тогда ошибка почти наверняка исчезнет.

...