2012-05-02 2 views
1

C++의 네이티브 라이브러리를 Java에 래핑하는 과정에서 SWIGTYPE_p_ 클래스를 발견했습니다. SWIG 문서를 읽고, here의 답변을 따르면 SWIG가 C++ 데이터 유형으로 무엇을해야할지 모를 때 이러한 클래스를 생성한다는 것을 알게됩니다. 데이터 형식에 대한 포인터를 만들려고 시도하지만 이러한 SWIGTYPE 클래스는 기능적으로 쓸모없는 것처럼 보입니다.SWIGTPYE_p 데이터 형식 Java

내가 좋아하는 포인터에 대한적인 typemap을 .I 파일에 %include typemaps.i을 넣어 사용했다 : 나는 또한 플로트 [] {[] 부동} 사용하여 시도

%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 *}; 

.

그것이 잘못되는 곳의 예 : 방법에 클래스 CAN_PKT에

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; 

결과 set_f 등 set_all하지만 set_f SWIGTYPE_p_float 입력으로 받아들이고, SWITYPE_p_float가 swigCptr 및 swigCMemOwn 이외의 내용이 없다.

float []을 올바르게 typemapped하지 않은 것 같지만 실제로 어떻게해야하는지 그리고 왜 이해해야합니까?

편집 :이 유니언은 데이터 형식이 short 인 유일한 곳입니다. 이 파일을 .i 파일에서 제외하고 swig를 실행하면 이것을 볼 수 있습니다. 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; 

합니다. 배열의 크기가 컴파일 타임에 고정되어 있기 때문에 배열을 래핑하는 몇 가지 다른 방법과 비교하면 작동합니다.