JNA - AMD Overdrive5 API returns 空指针错误
JNA - AMD Overdrive5 API returns null pointer error
我正在尝试通过 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
);
调用总是 returns -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
来节省一些冗长class 作为参数的类型。
我正在尝试通过 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
);
调用总是 returns -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
来节省一些冗长class 作为参数的类型。