次のような C 関数があります。
int make_call(char* to, int *call_id);
および非常に単純なインターフェイス ファイル:
%include "typemaps.i"
%include "enums.swg"
%include "arrays_java.i"
%header %{
#include <my_header.h>
%}
/* Map "int*" as input & output */
%apply int *INOUT { int * };
これはうまくいきます。私のSWIGファイルでは、 public static int make_call(String to, int[] call_id) {..} を取得し、1つの要素でint []を作成して呼び出すことができます。これまでのところすべて順調です。
ただし、call_id は非常に大きくなる可能性があるため、長くする必要があるため、C API でこれを変更し、.i ファイルに次の行を追加しました。
%apply long *OUTPUT { long * };
SWIGのjava.htmlドキュメントに記載されていることを適用しようとするなど、いくつかのバリアントを試しましたが、常にint [] beeingが生成されるか、Javaから使用できない長いswigtypeになります。私が期待している long[] を生成させることができません。
私はそれを次のようにダブルにしてみました:
%apply double *OUTPUT { double * };
期待どおりに動作し、生成されたインターフェイスで double[] call_id を取得します。
ロングタイプの落とし穴はありますか?奇妙に思えますよね?