我对这个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
关于如何进行的任何想法? 非常感谢!!!
答案 0 :(得分:0)
从您所显示的内容来看,SWIG所看到的类型与所使用的类型之间存在不匹配。
在call.hpp中你有:
vector<SrtpCrypto>
这里的这个向量几乎可以肯定是命名空间std中的一个,你已经告诉过SWIG要包装,但是由于某种类型的命名空间指令,你还没有看到它,SWIG没有这个问题。我们意识到它们属于同一类型,并使用默认的不透明类型而不是可互换的类型。
最简单的修复方法是将头文件更改为:
std::vector<SrtpCrypto>
相反,错误几乎肯定会消失。