2009-03-25 7 views
4

J'ai la fonction Delphi suivante:Comment puis-je la carte cette fonction Delphi avec la JNA

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

Le OutputBuffer et OutputBufferSize seraient fixés dans la fonction dans le cadre du résultat, avec un retour booléen pour indiquer si la La méthode a réussi (InputBuffer & OutputBuffer serait des tableaux d'octets).

J'ai réussi à mapper certaines de mes fonctions requises de la DLL avec la JNA et ils fonctionnent bien, mais celui-ci me donne des problèmes, toute aide serait appréciée.

Répondre

5

La plupart des documents de la JNA suppose que vous utilisez C, pas Delphi, donc commencer par le C équivalent à cette fonction:

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

Vous aurez également besoin d'obtenir la convention d'appel droit. La valeur par défaut de Delphi est registre, ce qui n'est probablement pas ce que vous voulez. Utilisez stdcall à la place; c'est ce que toutes les autres DLL utilisent.

Java ne possède pas d'équivalents de type non signés par rapport à ceux que vous avez utilisés, alors commencez par ignorer le non-signe. Cela fait InputBufferSize un int. Votre fonction renvoie un résultat booléen, utilisez donc boolean pour son type de retour. JNA prend en charge le passage des types par référence à travers les descendants de la classe ByReference, utilisez donc IntByReference pour OutputBufferSize.

Enfin sont les pointeurs. Vous avez dit que ce sont des tableaux d'octets, donc je ne comprends pas pourquoi vous ne les déclarez pas ainsi dans votre code Delphi. Utilisez PByte ou déclarez un nouveau type PByteArray et utilisez-le. (Cette modification rendra l'implémentation de cette fonction beaucoup plus pratique.) En Java, essayez de les déclarer comme des tableaux d'octets. Ainsi, le produit final:

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