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 作为参数的类型。