猿问

为多个参数对定义一次 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 ) { ...}

但是现在我想 SWIG 一个 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 中可行吗?


慕娘9325324
浏览 186回答 1
1回答

喵喔喔

如11.1.4 重用类型映射和11.2.3 复制类型映射中的 SWIG 手册中所述,您可以使用 轻松复制其他签名或类型的现有(多参数)类型映射%apply。在你的情况下,你可能需要%apply (void *outBuffer, int32_t bufferLen) { (void *outBuffer1, int32_t bufferLen1) };复制所有存在于(void *outBuffer, int32_t bufferLen)to 的类型图(void *outBuffer1, int32_t bufferLen1)。
随时随地看视频慕课网APP

相关分类

Java
我要回答