我正在尝试通过 pharo 的 NBOpenGL 包装器调用 OpenGL 函数。包装这个 OpenGL 函数的 smalltalk 方法
void glGetShaderiv ( GLuint shader , GLenum pname , long* params )
有签名
getShaderiv_shader:pname:params
所以 params: 参数显然必须是一个长指针。这就是为什么我试图用
NativeBoost allocate:
但实际上,当我调用 getShaderiv_shader 时,我不断收到
Error during FFI call : nil
每时每刻。
我究竟做错了什么 ??
该参数也应该是输出参数。
我在这里附上我的方法的完整代码。
aShader 是一个整数,而 GL_ 常量也是整数。
report:aShader
| len status statusPtr lenPtr logPtr |
len := GL_INFO_LOG_LENGTH.
status:= GL_COMPILE_STATUS.
statusPtr := NativeBoost allocate: (NBExternalType sizeOf: 'long').
statusPtr nbUInt64AtOffset: 0 put: 0.
gl getShaderiv_shader: aShader pname: status name params: statusPtr.
(statusPtr value == GL_FALSE) ifTrue: [
lenPtr := NativeBoost allocate: (NBExternalType sizeOf: 'int').
gl getShaderiv_shader: aShader pname: len params: lenPtr.
logPtr := NativeBoost allocate: (NBExternalType sizeOf: 'char') * (lenPtr+1).
gl getShaderInfoLog_shader: aShader bufSize:lenPtr length: 0 infoLog: logPtr.
].
Transcript show: logPtr.
statusPtr free.
lenPtr free.
logPtr free.
我在 Windows 7、64 位下使用 Pharo 3.0。我还在 smalltalkhub 的 2.0 配置中安装了 NBOpenGL。