перенос данных байтового массива с помощью SWIG array_class - PullRequest
1 голос
/ 18 февраля 2012

У меня есть функция C, которая возвращает беззнаковый символ *, который может быть либо указателем на байтовый массив (двоичные данные, представляющие File..etc), либо указателем на массив символов.В настоящее время я использую SWIG %array_class, который оборачивает все функции C, которые возвращают беззнаковый указатель char, и создает утилиту массива Java (SampleArrayUtil.java) для обработки заполнения и поиска на стороне Java.

Моя проблема в том, что я также использую обтекание unsigned char *, используя: %apply char * { unsigned char * };, чтобы получить массив строк на стороне Java.Я не хочу обернуть возвращаемое значение unsigned char * (используя %apply char * { unsigned char * };), когда я получаю двоичные данные, я хочу просто иметь байтовый массив на стороне Java.Я думал о создании еще одной функции C для обработки двоичных данных, но я не уверен, как обернуть эту новую функцию, поскольку она также возвратит unsigned char * (см. getValueFromRowAsByteArray)

CФункции:

unsigned char * getValueFromRowAsStringArray(struct result_row *row, attribute_type type, int32_t *len)

unsigned char * getValueFromRowAsByteArray(struct result_row *row, attribute_type type, int32_t *len)
//*row* input param with data results, *type* input enum type for the data type being requested and *len* is an output param that contains the length of the data being returned.

Файл интерфейса SWIG для переноса с помощью функции C Возвращение беззнакового символа * (массива символов):

%module Sample
%include "typemaps.i"
%include "stdint.i"
%include "arrays_java.i"
%include "carrays.i"
%array_class(unsigned char, SampleArrayUtil);
%{
#include "C_API.h"
%}
%apply char * { unsigned char * };
%include "C_API.h"

1 Ответ

2 голосов
/ 19 февраля 2012

Вы можете применять карты разных типов к одним и тем же типам в разных местах как минимум двумя способами.

Сначала вы можете изменить активную карту типов с помощью %apply или %clear, например:

%module test

%include "stdint.i"

%apply intptr_t { unsigned char * };
unsigned char * test1();

%apply char * { unsigned char * };
unsigned char * test2();

%clear unsigned char *;
unsigned char * test3();

Предоставляет три функции в Java с разными типами возвращаемых данных в соответствии с активной картой типов.

Во-вторых, вы также можете написать более конкретные таблицы типов, например:

%apply long long { unsigned char * test4 };
%apply char * { unsigned char * test5 };
unsigned char * test4();
unsigned char * test5();

Толькоприменяется к test4 и test5 соответственно - соответствует типу и имени функции.В Java это приводит к:

  public static long test4() {
    return testJNI.test4();
  }

  public static String test5() {
    return testJNI.test5();
  }

Для аргументов вы можете сопоставить тип и имя параметра в сигнатуре функции аналогично.

...