1

我正在尝试将一些使用 SDL 的代码转换为 Java。我正在使用 sdljava 绑定。

sdljava 使用 SWIG 作为 C 数据类型和 Java 之间的桥梁。为了得到 的等价物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 */ }

...其中 SDL 键状态值(如 SDLK_UP)索引到数组中。

但是,以下 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.iarrays_java.i可以帮助你,但他们不能;SWIG 和 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 回答