如何使用 JNA 获取静态最终变量

How to get static final variables using JNA

我正在使用 GLEW 库 glew32.dll(从 GLEW 网站标准下载),我正在尝试加载变量 GLEW_OK。此变量在 glew.h 文件中定义(作为 0 的 uint),因此我假设它将包含在 glew32.dll 文件中。但是,当我使用 Java JNA 代码时:

NativeLibrary glew = NativeLibrary.getInstance("glew.dll");
Pointer p = glew.getGlobalVariableAddress("GLEW_OK");
System.out.println(p.getInt(0));

我在线程 "main" java.lang.UnsatisfiedLinkError 中收到异常错误:查找错误 'GLEW_OK':找不到指定的过程。

at com.sun.jna.NativeLibrary.getGlobalVariableAddress(NativeLibrary.java:587)
at mcclean.opengl.glew.GLEWUtils.init(GLEWUtils.java:22)

库加载正常,但似乎找不到静态变量。为什么没有加载静态变量?

查看头文件glew.h,发现GLEW_OK是这样的:

/* error codes */
#define GLEW_OK 0

这是一个预处理器定义。这不是您在 Java 世界中想象的 "static final variable"。 C++项目编译时,预处理器#define本质上是预处理器"copypasted"到代码中。这意味着 if (val == GLEW_OK) 从字面上变成了 if (val == 0).

由于预处理器只是替换了文本,因此 .dll 文件中没有有关源自定义的值的名称或来源的信息。

您需要手动查找值。您可以通过从 GLEW 下载二进制文件并导航到 include/GL/glew.h 文件来执行此操作。在此之后,您可以为 Java:

中的常量创建一个 class
class GlewConstants {
    public static final int GLEW_OK = 0;
    // ...
}