有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用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)

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


共 (1) 个答案

  1. # 1 楼答案

    查看头文件glew.hGLEW_OK如下所示:

    /* error codes */
    #define GLEW_OK 0
    

    这是一个预处理器定义。这不是您在Java世界中想象的“静态final变量”。当编译C++项目时,预处理器^ {< CD3> }基本上是预处理器进入代码中的“复制”。这意味着if (val == GLEW_OK)从字面上改为if (val == 0)

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

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

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