Я работаю над вызовом одной DLL API для C/C++ с JNA. API-интерфейс функции в DLL — это короткий DKT_init (имя LPCSTR). Я сделал соответствующий java-метод общедоступным коротким DKT_init (имя строки); Но когда я его вызываю, API DLL возвращает ошибку параметра. Интересно, как сопоставить LPCSTR в JNA? Поскольку LPCSTR - это cons char *, а String - это char *.
Сопоставление JNA LPCSTR на платформе Windows
Ответы (2)
Строка является подходящим сопоставлением для LPCSTR. JNA преобразует измененные символы UTF16 в буфер байтов с нулевым завершением, используя кодировку платформы по умолчанию.
Вместо этого вы можете попробовать передать явный массив байтов (используя предложенное выше сопоставление альтернативного метода), что устранит потенциальную проблему с неправильной кодировкой, например.
byte[] arg = { (byte)'f', (byte)'o', (byte)'o', (byte)0 };
Вы можете изменить используемую кодировку, установив системное свойство «jna.encoding».
Вы также должны исключить возможность того, что "LPCSTR" на самом деле является неправильным типом; если функция ожидает буфер, в который она может записывать, String не будет работать, а если на самом деле это LPTCSTR и вы используете UNICODE, то вместо этого вам нужно передать WString.
Вы пытались сопоставить его с массивом байтов, например:
short DKT_INIT(byte [] nameAsByteArray);
//now you should be able to obtain it like this:
System.out.println(new String(nameAsByteArray).trim());