一次为多个参数对定义SWIG类型图

时间:2018-07-24 18:33:00

标签: java swig

我已使用特定于两个参数的类型和名称的%typemap成功地将缓冲区指针/缓冲区长度对映射到ByteBuffer。

对于同一方法中的多对参数,而又没有类型映射的近冗余副本,,仅按类型匹配,我该怎么做?

详细信息

例如,使用以下类型映射:

%typemap(jni) (void *outBuffer, int32_t bufferLen ) "jobject"
%typemap(jtype) (void *outBuffer, int32_t bufferLen) "java.nio.ByteBuffer"
%typemap(jstype) (void *outBuffer, int32_t bufferLen) "java.nio.ByteBuffer"
%typemap(javain) (void *outBuffer, int32_t bufferLen) 
"$javainput"
%typemap(javaout) (void *outBuffer, int32_t bufferLen) {
    return $jnicall;
}
%typemap(in) (void *outBuffer, int32_t bufferLen) {
    $1 = jenv->GetDirectBufferAddress($input);
    $2 = (long)(jenv->GetDirectBufferCapacity($input));
}

我可以SWIG这样的C ++方法:

int32_t getArrayData( void * outBuffer, int32_t bufferLen );

进入Java绑定,例如:

public int getArrayData( java.nio.ByteBuffer outBuffer ) { ...}

但是现在我想切换一个C ++方法来接受两个参数对:

int32_t getArrayData( void * outBuffer, int32_t bufferLen,
    void * outBuffer1, int32_t bufferLen1 );

并使用Java:

public int getArrayData( java.nio.ByteBuffer outBuffer,
   java.nio.ByteBuffer outBuffer1 ) { 

没有:

  • 复制上面的所有%typemaps,并在每个参数名称的末尾添加一个“ 1”。
  • 通过删除上面void*中的所有参数名称来匹配所有int32_t / %typemaps参数对。
  • 在* .i文件上运行预处理器。

在SWIG中这可行吗?

1 个答案:

答案 0 :(得分:2)

11.1.4 Reusing typemaps11.2.3 Copying a typemap中的SWIG手册中所述,您可以使用%apply轻松地将现有(多参数)类型映射复制为其他签名或类型。在您的情况下,您可能需要

%apply (void *outBuffer, int32_t bufferLen) { (void *outBuffer1, int32_t bufferLen1) };

(void *outBuffer, int32_t bufferLen)存在的所有类型映射复制到(void *outBuffer1, int32_t bufferLen1)