我正在使用GLEW库glew32.dll(可从GLEW网站下载标准文件),并且正在尝试加载变量GLEW_OK。此变量在glew.h文件中定义(单位为0),因此我假设它将包含在glew32.dll文件中。但是,当我使用Java JNA代码时:
NativeLibrary glew = NativeLibrary.getInstance("glew.dll");
Pointer p = glew.getGlobalVariableAddress("GLEW_OK");
System.out.println(p.getInt(0));
在线程“主” 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世界中可能想到的“静态最终变量”。编译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;
// ...
}
关于java - 如何使用JNA获得静态最终变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46208757/