Как вернуть char * aarr= new char[200] из C++ в Java с помощью JNA

Я новичок в ЮНА. в моем одном приложении мне нужно вернуть char * aarr= new char[200] в java из c. Я не могу понять, как это сделать. Каким должен быть тип возвращаемого значения моей функции С++? И как мне объявить свой java-метод для восстановления массива символов? Есть ли другой способ, например, передать переменную по ссылке в С++, чтобы получить значение char[] для С++?


person Jony    schedule 18.05.2012    source источник
comment
Убедитесь, что возвращаемое значение действительно является строкой C с нулевым завершением и закодировано в ASCII. Если строка имеет кодировку UTF8 или другую, вам необходимо указать кодировку (извлеките byte[] из значения указателя и Native.toString(byte[] data, String encoding).   -  person technomage    schedule 18.05.2012
comment
@BhavikAmbani отличается от ссылки, которую вы только что вставили, это о JNA, а ваша о JNI   -  person Jony    schedule 18.05.2012
comment
Предполагая, что возвращенный указатель действительно указывает на буфер из 260 символов (а не на LPTCHAR или что-то подобное), извлеките данные с помощью Pointer.getByteArray(0, 260) и распечатайте результаты в шестнадцатеричном формате. Это покажет вам фактическое содержимое памяти, и если оно содержит удобочитаемый контент, вы увидите шестнадцатеричные значения в диапазоне ASCII (0x40-0x7F или около того). JNA сможет извлечь правильные данные только в том случае, если вы знаете размер и формат базовых данных (чего, по-видимому, вы не знаете, поскольку Pointer.getString(0) не дает ожидаемого результата).   -  person technomage    schedule 18.05.2012
comment
@technomage я отредактировал свой вопрос, пожалуйста, прочитайте, скажите мне, как мне отобразить это в java?   -  person Jony    schedule 19.05.2012
comment
Пожалуйста, прочтите мой комментарий выше.   -  person technomage    schedule 19.05.2012
comment
Если вы передадите byte[] в качестве параметра в JNA, код C++ сможет выполнить запись в результирующий буфер, и вызывающая сторона увидит результат. Если собственный код действительно возвращает строку C с правильным завершением NUL, вы можете использовать String в качестве возвращаемого типа. Если ничего из этого не работает, значит, формат вашей строки не является строкой C с завершающим нулем, и вам нужно проверить содержимое памяти, как описано выше, чтобы определить, с каким форматом вы имеете дело.   -  person technomage    schedule 19.05.2012
comment
@technomage, позвольте мне уточнить, что char * aarr = new char[3318000]. который получает данные для изображения в градациях серого. Теперь я хочу каким-то образом вернуть этот aarr в java, получить это изображение в java для дальнейшей обработки изображения, поскольку я разрабатываю приложение для обработки рентгеновских изображений. Итак, теперь, пожалуйста, подскажите мне, что делать?   -  person Jony    schedule 19.05.2012


Ответы (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;

person technomage    schedule 21.05.2012

Попробуйте использовать Pointer.getCharArray(long offset,int arraySize) метод указателя класс.

Я предполагаю, что вы печатаете произвольное место в памяти указателя, преобразованного в строку с помощью кодировки по умолчанию.

person Santosh    schedule 18.05.2012
comment
getCharArray() определенно неправильно делать для любых char данных. - person technomage; 21.05.2012