2016-04-06 2 views
2

Я хочу обернуть структуру Java с массивом фиксированного размера без знака в байт [] в Java. Мой файл интерфейса в настоящее время выглядит следующим образом:SWIG Java - обнуление unsigned char [] в байте []

%module example 
%include "arrays_java.i" 

struct myStruct 
{ 
    unsigned char data[1024]; 
    int len; 
}; 

Java-прокси, созданные содержат получить и установить методы, которые принимают и возвращают короткий [].

Есть ли способ, и если да, то каким простым способом я могу заставить SWIG генерировать прокси-серверы java с использованием байт [] вместо короткого []?

Я не хочу каким-либо образом изменять структуру. Это просто упрощенный пример очень большого интерфейса, который я должен обернуть, который я не могу изменить.

Мне известно о том, что байт в java подписан и не охватывает диапазон unsigned char в C, но для передачи данных вокруг него гораздо удобнее, чем иметь дело с short [] или оболочкой, созданной с использованием array_class, определенный в файле carrays.i, который в конечном итоге предлагает методы getItem и setItem, которые, в свою очередь, берут или возвращают короткие.

Так что мой вопрос заключается в том, могу ли я каким-то образом заставить свинг каким-то образом (возможно, с некоторой типовой страницей) обрабатывать данные unsigned char [1024], такие как char [1024], в том, что он сопоставляется с байтом [] в java.

+0

http://swig-user.narkive.com/G7BOFpOB/swig-convert-unsigned-char-pointer-to-byte-array – user3159253

+0

Также см. Http://stackoverflow.com/questions/11564334/how-to -define-swig-typemap-for-return-unsigned-char-back-to-java – user3159253

+1

Основная проблема Java-байта заключается в том, что он подписан так, технически «короткий» является наименьшим типом для обработки полного диапазона «0-255» , – user3159253

ответ

2

Мы можем заставить SWIG обрабатывать ваши неподписанные массивы символов в виде подписанных массивов символов с целью упаковки SWIG только с использованием %apply. Например с помощью:

%module example 
%include "arrays_java.i" 

%apply signed char[ANY] { unsigned char[ANY] }; 

struct myStruct 
{ 
    unsigned char data[1024]; 
    int len; 
}; 

Заставляет это произойдет для всех unsigned char массивов любого (известного) размера. (Подумайте о %apply, как TypeMap копировать и вставить)

Вы также мог бы написать:

%apply signed char[ANY] { unsigned char data[ANY] }; 

Или:

%apply signed char[ANY] { unsigned char data[1024] }; 

, которые будут применяться только к массивам типа unsigned char любого размера или размера 1024 соответственно.


Как удобный наконечник: я понял, какие именно typemaps я хотел, чтобы соответствовать на для %apply по телефону SWIG с флагом «-debug-tmsearch», который показал, первоначально:

.... 
test.i:8: Searching for a suitable 'jni' typemap for: unsigned char data[1024] 
    Looking for: unsigned char data[1024] 
    Looking for: unsigned char [1024] 
    Looking for: unsigned char data[ANY] 
    Looking for: unsigned char [ANY] 
    Using: %typemap(jni) unsigned char [ANY] 
.... 

который показывает, какие шаблоны будут применяться в каком порядке приоритета для каждой типовой карты, используемой вашим интерфейсом.