如何使用 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;
// ...
}
我正在使用 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 GlewConstants {
public static final int GLEW_OK = 0;
// ...
}