bytebuffer android как intbuffer - asarray всегда дает исключение неподдерживаемой операции - PullRequest
0 голосов
/ 05 октября 2011

Я пытаюсь получить набор mipmaplevels и сохранить их в файле локального кэша, чтобы избежать их повторной сборки каждый раз (а их предварительная генерация нецелесообразна ...)

У меня есть mipmaplevels в наборе растровых изображений, и теперь я хочу записать их в мой файл кэша, но независимо от того, какой тип буфера я использую (прямой или нет, установка метеорологом или нет), hasArray всегда возвращает false на Intbuffer. Должно быть, я здесь что-то делаю глупо, но больше не вижу дерева для деревьев.

Давно не использую java, так что это просто ошибка noob;)

Код выглядит так:

  int tsize = 256;
  ByteBuffer xbb = ByteBuffer.allocate(tsize*tsize*4);
  // or any other variety of create like wrap etc. makes no diference
  xbb.order(ByteOrder.nativeOrder()); // in or out - makes no difference
  IntBuffer ib = xbb.asIntBuffer();
  for (int i = 0; i < tbm.length; i++) {
    //ib.array() throws exception, ib.hasArray() returns false;
    tbm[i].getPixels(ib.array(), 0, tsize, 0, 0, tsize, tsize);
    ou.write(xbb.array(), 0, tsize*tsize*4);
    tsize = tsize / 2;
  }

Ответы [ 2 ]

1 голос
/ 19 апреля 2012

В моем тестировании замена ByteBuffer на IntBuffer с использованием ByteBuffer.asIntBuffer() приводит к потере массива поддержки.

Если вы используете IntBuffer.allocate(tsize*tsize) вместо этого, вы сможете получитьрезервный массив.

ByteBuffer buf = ByteBuffer.allocate(10);
IntBuffer ib = buf.asIntBuffer();
System.out.printf("Buf %s, hasArray: %s, ib.hasArray %s\n", ib, buf.hasArray(), ib.hasArray());

buf = ByteBuffer.allocateDirect(10);
ib = IntBuffer.allocate(10);
System.out.printf("Buf %s, hasArray: %s, ib.hasArray %s\n", ib, buf.hasArray(), ib.hasArray());

Производит:

Buf java.nio.ByteBufferAsIntBufferB[pos=0 lim=2 cap=2], buf.hasArray: true, ib.hasArray false
Buf java.nio.HeapIntBuffer[pos=0 lim=10 cap=10], buf.hasArray: false, ib.hasArray true
1 голос
/ 23 ноября 2011

См. эту ссылку - это говорит о той же проблеме.Там есть ответы;тем не менее, он завершается следующим образом:

In another post
http://forum.java.sun.com/thread.jsp?forum=4&thread=437539
it is suggested to implement a version of DataBuffer which is
backed by a (Mapped)ByteBuffer *gasp* ...

Обратите внимание, что forum.java.sun.com переехал куда-то в Oracle.Надеюсь, это поможет.Во всяком случае, если вы найдете лучший ответ, дайте мне знать: -)

...