2012-05-02 4 views
1

В процессе переноса собственной библиотеки в C++ на Java я сталкивался с классами SWIGTYPE_p_. Чтение документов SWIG и после ответа от here я более или менее понимаю, что SWIG генерирует эти классы, когда он не знает, что делать с типом данных C++. Он пытается создать указатель на тип данных, но эти классы SWIGTYPE кажутся функционально бесполезными.Типы данных SWIGTPYE_p Java

Я поставил %include typemaps.i в .i файл, и используется typemaps для указателей, как:

%apply char * {unsigned char *}; 
%apply float * {float *}; 
%apply int * {int *}; 
%apply int * {unsigned long *}; 
%apply short * {unsigned short *}; 
%apply byte * {byte *}; 
%apply long * {unsigned long long *}; 

Я также попытался с помощью поплавка [] {поплавок []}.

Пример, где он идет неправильно:

typedef union CAN_PKT_ { 
    unsigned long long all; 
    float    f[2]; 
    unsigned long  ul[2]; 
    unsigned short  us[4]; 
    unsigned char  uc[8]; 
} CAN_PKT; 

приводит к классу CAN_PKT с методами set_all, Set_F и т.д., но Set_F принимает SWIGTYPE_p_float в качестве входных данных, и SWITYPE_p_float не имеет, кроме swigCptr и swigCMemOwn содержимого.

Наверное, я не правильно поменял float [], но я действительно не понимаю, как это должно быть сделано и почему?

EDIT: Этот союз является единственным местом, где используется тип данных short. Я могу показать это, запустив swig с этим файлом, оставшимся из файла .i, SWIGTYPE_p_unsigned_short не создается. НО, если я прокомментирую содержимое союза, так что unsigned short нигде не используется и включает этот файл в swig, он все равно создает SWIGTYPE_p_unsigned_short. Почему это могло произойти?

ответ

0

SWIG обернул ваши типы массивов так, как если бы они были указателем - он не может представить концепцию указателя на языке более высокого уровня очень значимо, хотя он обернут как непрозрачный тип.

Если вы хотите работать с массивами, то вы можете использовать SWIG's support for arrays with Java, выполнив:

%module test 

%include "arrays_java.i" 

typedef union CAN_PKT_ { 
    unsigned long long all; 
    float    f[2]; 
    unsigned long  ul[2]; 
    unsigned short  us[4]; 
    unsigned char  uc[8]; 
} CAN_PKT; 

, который генерирует код, который вы надеялись. (Это работает по сравнению с некоторыми другими методами для обертывания массивов, поскольку размер массива фиксируется во время компиляции)