gpt4 book ai didi

java - JNA - AMD Overdrive5 API 返回空指针错误

转载 作者:行者123 更新时间:2023-11-30 10:18:41 29 4
gpt4 key购买 nike

我正在尝试通过 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com