2009-03-25 3 views
4

У меня есть следующие функции Delphi:Как бы отобразить эту функцию Delphi с ЮНА

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

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

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

ответ

5

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

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

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

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

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

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