2010-11-17 30 views
1

Je travaille sur appeler une DLL api pour C/C++ avec JNA. L'API de fonction dans la DLL est courte DKT_init (nom LPCSTR). J'ai fait la méthode java correspondante comme public short DKT_init (String name); Mais quand je l'appelle, l'API DLL renvoie une erreur de paramètre. Je me demande comment faire pour cartographier LPCSTR en JNA? Comme LPCSTR est par contre char * mais String est char *.JNA mappage LPCSTR sur la plate-forme Windows

Répondre

0

Avez-vous essayé il mappez à un tableau d'octets, comme ceci:

short DKT_INIT(byte [] nameAsByteArray); 
//now you should be able to obtain it like this: 
System.out.println(new String(nameAsByteArray).trim()); 
1

chaîne est la cartographie appropriée pour LPCSTR. JNA convertira les caractères UTF16 modifiés en un tampon d'octets à terminaison NUL en utilisant le codage de plate-forme par défaut.

Vous pouvez essayer de passer dans un tableau d'octets explicite à la place (en utilisant le mappage de méthode alternative suggéré ci-dessus), ce qui éliminerait le potentiel d'un problème de codage incorrect, par ex.

byte[] arg = { (byte)'f', (byte)'o', (byte)'o', (byte)0 }; 

Vous pouvez modifier le codage utilisé en définissant la propriété système "jna.encoding".

Vous devriez également éliminer la possibilité que "LPCSTR" soit réellement un type incorrect; Si la fonction attend un buffer, elle peut écrire sur, String ne fonctionnera pas, et si c'est réellement LPTCSTR et que vous utilisez UNICODE, alors vous devez passer un WString à la place.