Java Panama / API внешних функций и памяти: чтение массивов байтов неизвестной длиныJAVA

Программисты JAVA общаются здесь
Anonymous
Java Panama / API внешних функций и памяти: чтение массивов байтов неизвестной длины

Сообщение Anonymous »

Рассмотрим заголовочный файл, определяющий этот метод:

Код: Выделить всё

ErrorCode_t GetBlob(Handle_const_t hHandle, uint8_t* const pValue, size_t* const pnSize);
Этот метод записывает n байтов в массив, начиная с указателя pValue. Размер n будет установлен по указателю pnSize.
Заголовок можно преобразовать в исходный код Java с помощью jextract, что дает:

Код: Выделить всё

public static long GetBlob(MemorySegment hHandle, MemorySegment pValue, MemorySegment pnSize) {
// ..
}
После прочтения https://stackoverflow.com/questions/76978598 и https://stackoverflow.com/questions/71250218 я выделил C_POINTER с неограниченным макетом адреса и вызвал метод:

Код: Выделить всё

    MemorySegment handle = ..;
MemorySegment arrayPointer = Arena.global().allocate(C_POINTER);
MemorySegment sizePointer = Arena.global().allocate(JAVA_LONG);
Accessor_h.GetBlob(handle, arrayPointer, sizePointer);
Вызов успешен. SizePointer содержит размер массива.
Но чтение данных массива не выполняется. Я попробовал следующее:

Код: Выделить всё

    arrayPointer.get(C_POINTER, 0L)
.toArray(JAVA_BYTE); // fails with "Segment is too large to wrap as byte[]. Size: 9223372036854775807"
Или:

Код: Выделить всё

    arrayPointer.get(C_POINTER, 0L)
.asSlice(0L, sizePointer.get(JAVA_LONG, 0L))
.toArray(JAVA_BYTE); // SIGSEGV (0xb)
Или:

Код: Выделить всё

    arrayPointer
.toArray(JAVA_BYTE); // seems to contain the correct data, but only the first eight bytes
Или:

Код: Выделить всё

    arrayPointer
.asSlice(0L, sizePointer.get(JAVA_LONG, 0L))
.toArray(JAVA_BYTE); // fails with "java.lang.IndexOutOfBoundsException: Out of bound access on segment MemorySegment"
Что я могу сделать, чтобы безопасно прочитать массив байтов в Java?

Подробнее здесь: https://stackoverflow.com/questions/784 ... known-leng

Вернуться в «JAVA»