如何在 LWJGL 3 中使用 glfwSetWindowUserPointer?
How can I use glfwSetWindowUserPointer in LWJGL 3?
我正在尝试制作一个 Window class 来抽象所有 GLFW 的东西。问题是我不知道如何在 LWJGL 中使用 glfwSetWindowUserPointer。
我以前用过这个函数,但用的是 C++。现在我要使用 LWJGL 移动到 Java。
在 C++ 中,我会做类似的事情:
glfwSetWindowUserPointer(myWindow, &myData)
但在 LWJGL 中,该函数需要 2 个 long
,其中第一个参数是 window 句柄,但我不知道如何处理第二个参数。
如何将指针传递到包含回调中所需的所有数据的对象?
提前致谢
在 @elect's 上扩展关于 JNINativeInterface
和 memGlobalRefToObject
的内容:
import org.lwjgl.system.MemoryUtil;
import org.lwjgl.system.jni.JNINativeInterface;
class JavaObject {
String message;
JavaObject(String message) {
this.message = message
}
}
final long pointer = JNINativeInterface.NewGlobalRef(new JavaObject("Hello"));
JavaObject object = MemoryUtil.memGlobalRefToObject(pointer);
JNINativeInterface.DeleteGlobalRef(pointer);
System.out.println(object.message) // => "Hello"
// Already deleted the strong reference held by the native part of the application.
object = MemoryUtil.memGlobalRefToObject(pointer);
System.out.println(object) // => null
一点建议:我只将 GLFW 用户指针用于 glfwSetMonitorCallback
和 glfwSetErrorCallback
设置的回调。 window 回调不需要它,因为你为每个 window 设置了一个回调,所以你已经有了对每个 Java 包装器 class.[=17 的引用=]
class Window {
final long handle;
int width;
int height;
WindowObserver observer;
Window(final long handle, final int width, final int height) {
this.handle = handle;
this.width = width;
this.height = height;
glfwSetWindowSizeCallback(handle, (handle, w, h) -> {
if (observer != null) {
observer.windowDidResize(this, this.width, this.height, w, h);
}
this.width = w;
this.height = h;
});
}
}
我正在尝试制作一个 Window class 来抽象所有 GLFW 的东西。问题是我不知道如何在 LWJGL 中使用 glfwSetWindowUserPointer。
我以前用过这个函数,但用的是 C++。现在我要使用 LWJGL 移动到 Java。
在 C++ 中,我会做类似的事情:
glfwSetWindowUserPointer(myWindow, &myData)
但在 LWJGL 中,该函数需要 2 个 long
,其中第一个参数是 window 句柄,但我不知道如何处理第二个参数。
如何将指针传递到包含回调中所需的所有数据的对象?
提前致谢
在 @elect's JNINativeInterface
和 memGlobalRefToObject
的内容:
import org.lwjgl.system.MemoryUtil;
import org.lwjgl.system.jni.JNINativeInterface;
class JavaObject {
String message;
JavaObject(String message) {
this.message = message
}
}
final long pointer = JNINativeInterface.NewGlobalRef(new JavaObject("Hello"));
JavaObject object = MemoryUtil.memGlobalRefToObject(pointer);
JNINativeInterface.DeleteGlobalRef(pointer);
System.out.println(object.message) // => "Hello"
// Already deleted the strong reference held by the native part of the application.
object = MemoryUtil.memGlobalRefToObject(pointer);
System.out.println(object) // => null
一点建议:我只将 GLFW 用户指针用于 glfwSetMonitorCallback
和 glfwSetErrorCallback
设置的回调。 window 回调不需要它,因为你为每个 window 设置了一个回调,所以你已经有了对每个 Java 包装器 class.[=17 的引用=]
class Window {
final long handle;
int width;
int height;
WindowObserver observer;
Window(final long handle, final int width, final int height) {
this.handle = handle;
this.width = width;
this.height = height;
glfwSetWindowSizeCallback(handle, (handle, w, h) -> {
if (observer != null) {
observer.windowDidResize(this, this.width, this.height, w, h);
}
this.width = w;
this.height = h;
});
}
}