簡體   English   中英

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, &$1, &len);
    $2 = (size_t)len;
  }

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

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

你能做同樣的事情,但是對於 java 語言? 所以答案會像

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

所以我需要它來生成正確的 JAVA 包裝代碼

Function 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 function:

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

這與您想要的語義完全匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM