我正在尝试通过 JNA 访问 AMD ADL Overdrive5 API 以检索 JAVA 中 GPU 的温度。 我能够通过 ADL API 检索适配器信息。但是我很难检索 GPU 温度。
API函数定义为:
int ADL2_Overdrive5_Temperature_Get (
ADL_CONTEXT_HANDLE context,
int iAdapterIndex,
int iThermalControllerIndex,
ADLTemperature * lpTemperature
)
并期望一个指向包含两个整数的结构的指针。
我的代码是:
public interface ADL extends Library {
public static class T1Str extends Structure {
public static class ByReference extends T1Str implements Structure.ByReference {}
public int iSize;
public int iTemperature;
@Override
protected List<String> getFieldOrder() {
re turn ImmutableList.of(
"iSize",
"iTemperature"
);
}
}
public int ADL_Overdrive5_Temperature_Get(
Pointer context,
int iAdapterIndex,
int iThermalControllerIndex,
T1Str.ByReference pointer
);
}
函数的实际调用是:
final T1Str.ByReference str = new T1Str.ByReference();
str.iSize = str.size();
final int result = adl.ADL_Overdrive5_Temperature_Get(
context,
adapterIndex,
0,
str
);
调用总是返回 -9 作为转换为 ADL_ERR_NULL_POINTER:空指针错误的结果
感谢任何帮助。
最佳答案
查看 documentation , 似乎有两个不同的,容易混淆的相似命名函数:
int ADL_Overdrive5_Temperature_Get(
int iAdapterIndex,
int iThermalControllerIndex,
ADLTemperature *lpTemperature
)
...和...
int ADL2_Overdrive5_Temperature_Get(
ADL_CONTEXT_HANDLE context,
int iAdapterIndex,
int iThermalControllerIndex,
ADLTemperature *lpTemperature
)
您现在可能已经意识到,您不小心调用了第一个,而您本打算调用第二个。因为您为 first 函数的第三个参数传递了 0,所以您实质上是为指针参数传递了 NULL
。
在您的 Java 方法名称中包含数字 2 以调用正确的函数。
public int ADL2_Overdrive5_Temperature_Get(
Pointer context,
int iAdapterIndex,
int iThermalControllerIndex,
T1Str.ByReference pointer
);
顺便说一下,如果我没记错的话,JNA 默认传递结构 arguments ByReference
所以你可以通过使用 T1Str
类作为参数的类型。
关于java - JNA - AMD Overdrive5 API 返回空指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49116493/