为多个参数对定义一次 SWIG 类型映射
Define SWIG typemaps once for multiple argument pairs
我已经使用特定于两个参数的类型和名称的 %typemap
成功地将 buffer-pointer/buffer-length 对映射到 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) {
= jenv->GetDirectBufferAddress($input);
= (long)(jenv->GetDirectBufferCapacity($input));
}
我可以像这样痛饮一个 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 中可行吗?
如 11.1.4 Reusing typemaps and 11.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)
。
我已经使用特定于两个参数的类型和名称的 %typemap
成功地将 buffer-pointer/buffer-length 对映射到 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) {
= jenv->GetDirectBufferAddress($input);
= (long)(jenv->GetDirectBufferCapacity($input));
}
我可以像这样痛饮一个 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 中可行吗?
如 11.1.4 Reusing typemaps and 11.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)
。