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

标签 java jna

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

相关文章:

java - 如何在没有客户端 key 的情况下仅使用客户端 ID 和租户 ID 使用 Azure 广告?

java - 使用 JNA 访问 .dll 时通过引用传递字符串

java - JNA:字符数组作为函数参数

java - 如何在 JNA 中调用带有前导下划线和尾随 @ 的方法

java - 如何更新显示对象详细信息的面板

java - 如何摆脱 javafx TableView 中的 java 堆空间内存问题?

java - 含咖啡因的 LRU

Java错误未能为jnidispatch库创建临时文件

java - 使用 WildFly 10 加载 native 库

java - 当使用 Java 的 Runtime.getRuntime().exec() 运行时,从源代码构建 Go 测试失败