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

时间:2017-09-14 00:33:36

标签: java jna glew

我正在使用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)

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

1 个答案:

答案 0 :(得分:1)

查看标题文件glew.hGLEW_OK如下:

/* error codes */
#define GLEW_OK 0

这是预处理器定义。这不是你在Java世界中设想的“静态最终变量”。编译C ++项目时,预处理器#define基本上由预处理器“复制”到代码中。这意味着if (val == GLEW_OK)字面上已更改为if (val == 0)

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

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

class GlewConstants {
    public static final int GLEW_OK = 0;
    // ...
}