gpt4 book ai didi

java - 如何在 LWJGL 3 中使用 glfwSetWindowUserPointer?

转载 作者:行者123 更新时间:2023-11-30 05:37:48 25 4
gpt4 key购买 nike

我正在尝试创建一个 Window 类来抽象所有 GLFW 内容。问题是我不知道如何在 LWJGL 中使用 glfwSetWindowUserPointer 。

我以前用过这个函数,但是是在 C++ 中。现在我正在转向 Java,使用 LWJGL。

在 C++ 中,我会做类似的事情:

    glfwSetWindowUserPointer(myWindow, &myData)

但在 LWJGL 中,该函数需要 2 long,其中第一个参数是窗口句柄,但我不知道如何处理第二个参数。

如何将指针传递给包含回调中我需要的所有数据的对象?

提前致谢

最佳答案

扩展@electcomment关于 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 用户指针用于通过 glfwSetMonitorCallbackglfwSetErrorCallback 设置的回调。窗口回调不需要它,因为您为每个窗口设置一个回调,因此您已经拥有对每个 Java 包装器类的引用。

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;
});
}
}

关于java - 如何在 LWJGL 3 中使用 glfwSetWindowUserPointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56264393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com