【问题标题】:How can I use glfwSetWindowUserPointer in LWJGL 3?如何在 LWJGL 3 中使用 glfwSetWindowUserPointer?
【发布时间】:2019-05-22 20:18:30
【问题描述】:

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

我以前使用过这个函数,但在 C++ 中。现在我正在使用 LWJGL 迁移到 Java。

在 C++ 中,我会这样做:

    glfwSetWindowUserPointer(myWindow, &myData)

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

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

提前致谢

【问题讨论】:

  • 看看JNINativeInterface.New/DeleteGlobalRefmemGlobalRefToObject

标签: java game-engine lwjgl


【解决方案1】:

扩展@electcomment 关于JNINativeInterfacememGlobalRefToObject

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2022-08-17
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多