2016-04-06 19 views
2

Javaのunsigned charの固定サイズの配列を含む構造体をbyte []に​​ラップしたいとします。私のインターフェイスファイルは現在、次のようになります。SWIG Java - unsigned char [] in byte []

%module example 
%include "arrays_java.i" 

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

作成したJavaプロキシを取ると[]のショートを返すgetおよびsetメソッドが含まれています。

私はSWIGにshort []の代わりにbyte []を使ってJavaプロキシを生成させる最も簡単な方法は何ですか?

私は構造体を変更したくありません。これは、私が変更することができないラップしなければならない非常に大きなインターフェースの単純な例です。

私はJavaのバイトが署名されていて、Cのunsigned charの範囲をカバーしていないことに気付いていますが、データを渡すためにはshort []やcarrays.iで定義されたarray_classは、getItemメソッドとsetItemメソッドを提供し、shortメソッドはshortメソッドを返します。

だから私は、Javaのバイト[]にマップするという点で、char [1024]のようなunsigned charデータ[1024]を扱うようにswigを(何らかの型マップを使って)強制することができます。

+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-returning-unsigned-char-back-to-java – user3159253

+1

Javaバイトの主な問題は、それが署名されていることです、技術的には 'short'はフルレンジ' 0-255'を扱う最小のタイプです。 。 – user3159253

答えて

2

SWIGは、%applyを使用する場合にのみ、SWIGラッピングの目的で、符号なしchar配列を符号付きchar配列として扱うことができます。使用例:

%module example 
%include "arrays_java.i" 

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

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

は、任意の(既知の)サイズの全てunsigned charアレイに対して行われるように強制します。 (タイプマップコピー&ペーストとして%applyを考える)

また書くことができます:

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

または:

のみ任意のサイズの種類 unsigned char、またはサイズのアレイに適用される
%apply signed char[ANY] { unsigned char data[1024] }; 

を1024である。


は便利なヒントとして:私はもともとあった「-debug-tmsearch」フラグとSWIG呼び出すことによって、私は%applyのために一致したかったタイプマップを正確に考え出し:

.... 
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] 
.... 

をどのあなたのインターフェイスで使用されているすべてのタイプマップに対して、どのような優先順位でどのタイプマップが適用されるかを示します。

関連する問題