Я новичок в ЮНА. в моем одном приложении мне нужно вернуть char * aarr= new char[200] в java из c. Я не могу понять, как это сделать. Каким должен быть тип возвращаемого значения моей функции С++? И как мне объявить свой java-метод для восстановления массива символов? Есть ли другой способ, например, передать переменную по ссылке в С++, чтобы получить значение char[] для С++?
Как вернуть char * aarr= new char[200] из C++ в Java с помощью JNA
Ответы (2)
Если вы возвращаете буфер из собственного кода, вам нужно использовать Pointer
и использовать различные методы доступа к данным указателя для получения/установки данных (например, Pointer.getByteArray()
и Pointer.setByteArray()
). Обратите внимание, что если данные выделяются собственным кодом, вы должны предоставить какой-то способ утилизации памяти, поэтому вам нужно будет либо сохранить указатель в собственном коде для последующего удаления, либо передать его обратно из Java (как Pointer
) чтобы ваш С++ мог выполнять соответствующую операцию delete[]
.
Если вы можете выделить буфер со стороны Java (рекомендуется, если стороне Java необходимо активно манипулировать данными), используйте прямой ByteBuffer
или Memory
, если данные долгоживущие, или массив примитивных байтов, если собственный код нуждается только в доступ к нему на время исходного вызова.
В документации JNA четко указано, что родной char
соответствует Java byte
.
Также имейте в виду, что Java имеет только значения со знаком, поэтому вам нужно будет преобразовать значения Java byte
(которые могут быть отрицательными) в более крупный тип (short
или int
) и замаскировать старшие биты, например.
int data = (int)byteValue & 0xFF;
Попробуйте использовать Pointer.getCharArray(long offset,int arraySize)
метод указателя класс.
Я предполагаю, что вы печатаете произвольное место в памяти указателя, преобразованного в строку с помощью кодировки по умолчанию.
char
данных.
- person technomage; 21.05.2012
byte[]
из значения указателя иNative.toString(byte[] data, String encoding)
. - person technomage   schedule 18.05.2012Pointer.getByteArray(0, 260)
и распечатайте результаты в шестнадцатеричном формате. Это покажет вам фактическое содержимое памяти, и если оно содержит удобочитаемый контент, вы увидите шестнадцатеричные значения в диапазоне ASCII (0x40-0x7F или около того). JNA сможет извлечь правильные данные только в том случае, если вы знаете размер и формат базовых данных (чего, по-видимому, вы не знаете, посколькуPointer.getString(0)
не дает ожидаемого результата). - person technomage   schedule 18.05.2012byte[]
в качестве параметра в JNA, код C++ сможет выполнить запись в результирующий буфер, и вызывающая сторона увидит результат. Если собственный код действительно возвращает строку C с правильным завершением NUL, вы можете использовать String в качестве возвращаемого типа. Если ничего из этого не работает, значит, формат вашей строки не является строкой C с завершающим нулем, и вам нужно проверить содержимое памяти, как описано выше, чтобы определить, с каким форматом вы имеете дело. - person technomage   schedule 19.05.2012