Как бы я отобразил эту функцию Delphi с JNA - PullRequest
4 голосов
/ 25 марта 2009

У меня есть следующая функция Delphi:

function DoX(const InputBuffer: Pointer; const InputBufferSize: longword; OutputBuffer: Pointer; var OutputBufferSize: longword): longbool;

OutputBuffer и OutputBufferSize будут установлены в функции как часть результата с логическим возвратом, указывающим, был ли метод успешным (InputBuffer & OutputBuffer будут байтовыми массивами).

Мне удалось сопоставить некоторые из моих необходимых функций из dll с JNA, и они работают нормально, однако эта проблема вызывает у меня проблемы, любая помощь будет оценена.

1 Ответ

5 голосов
/ 25 марта 2009

В большинстве документов JNA предполагается, что вы используете C, а не Delphi, поэтому начните с C, эквивалентного этой функции:

int DoX(const void* InputBuffer,
        unsigned int InputBufferSize,
        void* OutputBuffer,
        unsigned int* OutputBufferSize);

Вы также захотите получить соглашение о вызовах правильно. По умолчанию Delphi - register , что, вероятно, не то, что вам нужно. Используйте взамен stdcall ; это то, что использует каждая другая DLL.

В Java нет эквивалентов без знака для тех, которые вы использовали, поэтому начните с игнорирования без знака. Это делает InputBufferSize int. Ваша функция возвращает логический результат, поэтому используйте boolean для ее типа возврата. JNA поддерживает передачу типов по ссылке через потомков класса ByReference, поэтому используйте IntByReference для OutputBufferSize.

Наконец указатели. Вы сказали, что это байтовые массивы, поэтому я озадачен, почему вы не объявляете их таким образом в своем коде Delphi. Либо используйте PByte, либо объявите новый тип PByteArray и используйте его. (Это изменение сделает реализацию этой функции более удобной.) В Java попробуйте объявить их как байтовые массивы. Итак, конечный продукт:

boolean DoX(byte[] InputBuffer,
            int IntputBufferSize,
            byte[] OutputBuffer,
            IntByReference OutputBufferSize);
...