1

SDL を使用するコードを Java に変換しようとしています。私はsdljavaバインディングを使用しています。

sdljava は、C データ型と Java の間のブリッジとして SWIG を使用します。に相当するものを取得するためにSDL_GetKeyState()、sdljava は、SWIG_SDLEvent.SDL_GetKeyState()a と呼ばれるものを返すメソッドを提供しますSWIGTYPE_p_unsigned_char

もちろん、Java にはunsigned char型がなく、コンパイラがこの SWIG 型が実際に Java に対して何を表していると考えるかはわかりません。C/C++ での の通常の使用は次のSDL_GetKeyState()ようになります。

Uint8 *ks = SDL_GetKeyState(NULL);
if ( ks[SDLK_UP] ) { /* handle Up key */ }

...ここで、SDLK_UP インデックスのような SDL キーステート値が配列に挿入されます。

ただし、次の Java コード:

SWIGTYPE_p_unsigned_char ks = SWIG_SDLEvent.SDL_GetKeyState(null);
if ( ks[SDLKeyValues.SDLK_UP] != 0) { /* handle Up key */ }

「式の型は配列型でなければなりませんが、SWIGTYPE_p_unsigned_char に解決されました」というコンパイラ エラーが発生します。

私が知りたいのは、SWIG_SDLEvent.SDL_GetKeyState() を呼び出した後、返されたものを使用して個々のキーの状態を調べる方法です。

4

2 に答える 2

1

はい、これは他の質問と同じ問題の特殊なケースです。最初はあなたを助けることができると思っcarrays.iていましたが、彼らはできません。arrays_java.iSWIG も Java も SDL_GetKeyState() によって返される配列の大きさを認識していないため、Java 配列を生成することはできません。

この特定のケースでは、SWIG にはFillMeInAsSizeCannotBeDeterminedAutomatically、問題を解決できるものがあります。一般的には用途が限られていますが、SDL_GetKeyState()の戻り値が指す配列が一定サイズであると仮定すれば、それで十分です。ドキュメントとメーリング リストでそれを検索し、Java SWIG ドキュメントのアレイ セクションを熟考すると、進むべき道が明らかになるはずです。

于 2009-10-07T14:35:38.293 に答える
0

SWIG Java サポートの責任者である William Fulton と話をしたところ、彼は次のように答えました。

SWIGTYPE_p_unsigned_char の存在は、この「型ラッパー」クラスが Java からのアクセスにはあまり役に立たないため、ラッパーが十分に検討されていないことを示しています。

配列のソリューションについては、Java の章をお読みください - http://www.swig.org/Doc1.3/Java.htmlまたは、Java から呼び出すことができるヘルパー メソッドを追加するだけです。

%inline %{
 Uint8 getValueFromArray(Uint8* array, size_t i) {
  return array[i];
 }
%}
于 2009-10-08T15:54:02.620 に答える