2

I am trying to access the AMD ADL Overdrive5 API via JNA to retrieve temperatures of the GPU in JAVA. I am able to retrieve the adapter information via the ADL API. But I am having a hard time to retrieve the GPU Temperatures.

The API function is defined as:

int ADL2_Overdrive5_Temperature_Get (
    ADL_CONTEXT_HANDLE context,
    int iAdapterIndex,
    int iThermalControllerIndex,
    ADLTemperature * lpTemperature   
)   

and expects a Pointer to a structure containing two ints.

The code I have is:

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 
    );

}

The actual call of the function is:

final T1Str.ByReference str = new T1Str.ByReference();
str.iSize = str.size();
final int result = adl.ADL_Overdrive5_Temperature_Get(
    context,
    adapterIndex,
    0,
    str
);

The call always returns -9 as a result which translates into ADL_ERR_NULL_POINTER: Null Pointer error

Any help is appreciated.

1 Answer 1

1

Looking at the documentation, it appears that there's two different, confusingly similarly named functions:

int ADL_Overdrive5_Temperature_Get(
    int iAdapterIndex,
    int iThermalControllerIndex,
    ADLTemperature *lpTemperature
)

...and...

int ADL2_Overdrive5_Temperature_Get(
    ADL_CONTEXT_HANDLE context,
    int iAdapterIndex,
    int iThermalControllerIndex,
    ADLTemperature *lpTemperature
)

As you've probably realized by now, you're accidentally calling the first one whereas you meant to call the second one. Since you pass 0 for the third argument of the first function, you're essentially passing NULL for the pointer argument.

Include the number 2 in your Java method's name to call the correct function.

public int ADL2_Overdrive5_Temperature_Get(
    Pointer context,
    int iAdapterIndex,
    int iThermalControllerIndex,
    T1Str.ByReference pointer 
);

By the way, if I recall correctly, JNA passes structure arguments ByReference by default so you can save some verbosity by just using the T1Str class as the the argument's type.

Sign up to request clarification or add additional context in comments.

1 Comment

Very well documented and absolutely correct answer. Also the second suggestion (removing ByReference) is correct and is working fine. Thank you.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.