SWIG JAVA 类型映射配置

SWIG JAVA typemaps configuration

这是 SWIG 类型映射,可将 C++ 类型转换为 Python 类型。

#ifdef SWIGPYTHON
  %typemap(in) (char *data, size_t datasize) {
    Py_ssize_t len;
    PyBytes_AsStringAndSize($input, &, &len);
     = (size_t)len;
  }

  %typemap(in, numinputs=0) (char **data, size_t *datasize)(char *temp, size_t tempsize) {
     = &temp;
     = &tempsize;
  }

  %typemap(argout) (char **data, size_t *datasize) {
    if(*) {
      $result = PyBytes_FromStringAndSize(*, *);
      free(*);
    }
  }
#endif

你能做同样的事情吗,但是 java 语言?所以答案会像

#ifdef SWIGJAVA
  %typemap(in) (char *data, size_t datasize) {
    convertJavaBytesToC++Bytes();
    ...something else...
  }
...

所以我需要它来生成正确的 JAVA 包装代码

我想翻译成的 C++ 函数声明 JAVA:

public void getFrames(char **data, size_t *datasize) {
    std::string s = getFramesAsString();
    size_t size = s.length();
    char *c = new char[size];
    s.copy(c, size, 0);
    *datasize = size;
    *data = c;
};
public void putFrame(char *data, size_t datasize) {
    const std::lock_guard<std::mutex> lock(frames_mtx);
    frames.push_front(std::string(data, datasize));
};

SWIG 已经有一个 Java 的类型映射,可以为您完成此操作。要使用它,您需要做的就是使用 %apply 告诉 SWIG 它是您要用于这些参数的内容:

例如

%module test

%apply (char *STRING, size_t LENGTH) { (char *data, size_t datasize) }

void putFrame(char *data, size_t datasize);

这将生成以下 Java 函数:

  public static void putFrame(byte[] data) {
    ...

与您想要的语义完全匹配。