【问题标题】:Define SWIG typemaps once for multiple argument pairs为多个参数对定义一次 SWIG 类型映射
【发布时间】: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 typemaps11.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 就是答案。如果您将其发布为答案,我会接受。并感谢您提供链接。第二个有一个类似于这个问题的缓冲区/长度类型映射副本。
  • 通常我所做的是给类型映射一个通用名称,全部大写,然后在任何地方应用类型映射

标签: java swig


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多