Используя JNA, я загружаю DLL, написанную на C ++, и вызываю функцию, присутствующую в этой функции C ++:
int xxfunction(Char* ptr){...}
Здесь мне нужно отправить массив символов, чтобы функция присваивала ему значение. В основном мне нужно передать массив символов по ссылке.
Согласно документации JNA, C ++ char*
эквивалент в Java String
, поэтому я создал объект String и передал его функции, как показано ниже:
Объявление функции Java:
interface foo extends Library
{
....//loading dll and other work
int xxfunction(String chararray);//function declaration
}
Вызов функции Java:
public static void main(String args[])
{
String str="abcd";
int i=fooinstance.xxfunction(str);//function call
}
но когда я выполнил этот код, он дает мне:
Неустранимая ошибка была обнаружена средой выполнения Java:
Не удалось записать дамп ядра. Мини-дампы по умолчанию не включены
клиентские версии Windows
Авария произошла за пределами виртуальной машины Java в собственном коде. Смотрите проблемный кадр, где сообщать об ошибке.
Так это правильный способ передачи String в качестве аргумента, где функция ожидает указатель на символ?
Символьный эквивалент C ++ в Java является байтовым, так что мне нужно передать байтовый массив в качестве параметра?
Я даже не могу передать объект Pointer из JNA в функцию, потому что это дает мне IllegalargumentException
,
Только const char*
должен быть когда-либо сопоставлен с Java String
, Если есть такая возможность не являющийся const
, вы должны передать буфер вместо (byte[]
, Memory
или NIO Buffer), а затем используйте Native.toString()
на «возвращаемое» значение.
В качестве стиля вы всегда должны указывать вызываемому абоненту длину предоставленного буфера, чтобы у него было достаточно информации, чтобы избежать перезаписи буфера.
Других решений пока нет …