C++ のネイティブ ライブラリを Java にラップする過程で、SWIGTYPE_p_ クラスに遭遇しました。SWIG のドキュメントを読み、ここからの回答に従って、C++ データ型をどう処理すればよいかわからない場合に SWIG がこれらのクラスを生成することを多かれ少なかれ理解しています。データ型へのポインターを作成しようとしますが、これらの SWIGTYPE クラスは機能的に役に立たないようです。
%include typemaps.i
私は.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 *};
float[] { float[] } も使用してみました。
うまくいかない例:
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_all、set_f などを持つクラス CAN_PKT が生成されますが、set_f は入力として SWIGTYPE_p_float を受け入れ、SWITYPE_p_float には swigCptr と swigCMemOwn 以外の内容はありません。
float[] を適切にタイプマップしていないと思いますが、どのように行うべきか、またその理由がよくわかりません。
編集:short
この共用体は、データ型が使用される唯一の場所です。このファイルを .i ファイルから除外して swig を実行すると、これを確認できます。SWIGTYPE_p_unsigned_short は作成されません。しかし、どこにも使用されないようにユニオンの内容をコメントアウトし、unsigned short
このファイルをswigに含めると、それでもSWIGTYPE_p_unsigned_shortが作成されます。なぜこれが起こるのでしょうか?