【发布时间】:2018-07-24 18:33:00
【问题描述】:
我已经使用%typemap 成功地将缓冲区指针/缓冲区长度对映射到字节缓冲区,该%typemap 特定于两个参数的类型和名称。
对于同一方法中的多对参数,如果没有几乎冗余的类型映射副本 和,我该如何做同样的事情,而不是仅按类型匹配?
详情
例如,使用这些类型映射:
%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 中可行吗?
【问题讨论】:
-
%apply (void *outBuffer1, int32_t bufferLen1) { (void *outBuffer, int32_t bufferLen) };见11.1.4 Reusing typemaps 和11.2.3 Copying a typemap。 -
我刚刚意识到应该反过来,即
%apply (void *outBuffer, int32_t bufferLen) { (void *outBuffer1, int32_t bufferLen1) };这会将(void *outBuffer, int32_t bufferLen)存在的所有类型映射复制到(void *outBuffer1, int32_t bufferLen1)。 -
@HenriMenke - 完美。我试过了,它奏效了。您的 cmets 就是答案。如果您将其发布为答案,我会接受。并感谢您提供链接。第二个有一个类似于这个问题的缓冲区/长度类型映射副本。
-
通常我所做的是给类型映射一个通用名称,全部大写,然后在任何地方应用类型映射