Создание функции Java Utility для преобразования массива без знака в строку - PullRequest
0 голосов
/ 20 декабря 2011

SWIG преобразует приведенный ниже массив без знака («id») в short []. На стороне C атрибут id структуры sender_id_t_ является указателем на массив, который содержит буквенно-цифровые данные, такие как «TEST123-E». Я полагаю, вы могли бы зациклить short [] (sender_id_t_.getId ()) и привести каждый элемент к типу char и объединить для создания строки Java. Мне интересно, если это лучший и более простой способ справиться с этой ситуацией?

C Заголовочный файл:

#define SAMPLE_ID_SIZE_V1 32
#define SAMPLE_ID_SIZE SAMPLE_ID_SIZE_V1

typedef unsigned char sample_id_v1_t[SAMPLE_ID_SIZE];
typedef sample_id_v1_t sample_id_t;

struct sample_sender_id_t_ {
    sample_id_t           id;
    uint32_t              idx;
};
typedef struct sample_sender_id_t_ sample_sender_id_t;

SWIG.i:

%rename (Sample) sender_id_t_;
struct sender_id_t_ {
    unsigned char id_v1_t[32]      id;
    uint32_t   phy_idx;
};

Исключение:

 [exec] test_wrap.c: In function `TestJNI_Sample_1id_1set':
 [exec] test_wrap.c:826: error: cast specifies array type
 [exec] test_wrap.c:829: error: incompatible types in assignment
 [exec] test_wrap.c:832: error: `jarr2' undeclared (first use in this function)

1 Ответ

1 голос
/ 20 декабря 2011

Он обрабатывается как массив short из-за unsigned типа, что делает наибольшее значение слишком большим, чтобы поместиться в (подписанное) byte или char. Если вы хотите принудительно обработать String, вы можете использовать %apply, чтобы использовать обычные String карты типов, что-то вроде:

%module test

%rename (Sample) sender_id_t_;
%apply char * { unsigned char id[32] };

struct sender_id_t_ {
    unsigned char id[32];
    uint32_t   phy_idx;
};

(мне пришлось исправить какой-то синтаксис в вашем struct, это было немного странно).

...