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
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());
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.