Java JNA u32t возвращаемое значение указателя (память) - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь получить доступ к методу C ++ DLL с использованием JNA.

Определение следующее:

u32t OpenPort(u8t valueA, char* valueB, u32t* handle);

Я не уверен, как отобразить u32t и как получитьreturnValue используя или Pointer или Memory возможно?

Я сделал это так:

int OpenPort(byte valueA, String valueB, IntByReference handle); //u32t OpenPort(u8t type, char* myString, u32t* handle);

и вызвав

        IntByReference handle = new IntByReference();            
        byte i = 0;
        int error = myClass.OpenPort(i, "my string", handle);
        System.out.println(error  + " - " + handle.getValue());

Результат - "0 - 0".

С ошибкой "0" все в порядке, но returnValue не должно быть 0. Поскольку это значение, которое мне нужно передать другим методам, таким как:

int ClosePort(IntByReference handle); //u32t ClosePort(u32t handle);

, если я начну:

error = myClass.ClosePort(handle);

В сообщении об ошибке указывается, что дескриптор порта недопустим.

Пример кода C # от производителя DLL выглядит следующим образом:

UInt32 handle;
UInt32 error;
error= OpenPort(0, "teststring", out handle);
xError = ClosePort(handle);

1 Ответ

0 голосов
/ 21 сентября 2019

Добро пожаловать в StackOverflow.

Pointer фактически указывает на собственную память, где есть 32-битное значение.Но отображение только на Pointer не скажет вам, что находится в указанном месте.

Вам следует использовать класс IntByReference для моделирования *uint32_t или аналогичного указателя на 32-битное значение.Метод вернет указатель, но вы можете использовать метод getValue() для получения нужного значения.

Также я заметил, что вы использовали NativeLong для возвращаемого типа, но он явно указанкак 32-разрядный, поэтому вы хотите использовать int.Используйте NativeLong только для ситуации, когда long определяется как 32-разрядный или 64-разрядный в зависимости от разрядности операционной системы.

Обратите внимание, что в Java нет концепции для целых чисел со знаком и без знака.Хотя значение будет 32-разрядным int, вам нужно будет обрабатывать отрицательные значения в своем собственном коде путем преобразования их в их беззнаковые аналоги.

Таким образом, ваше отображение должно быть:

int MethodName(byte valueA, String valueB, IntByReference returnValue);

Затем позвоните по номеру:

IntByReference returnValue = new IntByReference();
MethodName(valueA, ValueB, returnValue);
int theU32tValue = returnValue.getValue();
...