开发者

android bytebuffer as intbuffer - asarray always gives unsupportedoperationexception

I'm trying to grab a set of mipmaplevels and save to a local cache file to avoid rebuilding them each time (and it is not practical to pre-generate them...)

I've got the mipmaplevels into a set of bitmaps OK, and now want to write them to my cache file, but whatever variety of buffer I use (direct or not, setting byteorder or not) hasArray always comes back false on the intbuffer. I must be doing something silly here, but I can't see the wood for the trees an开发者_Go百科ymore.

Not been using java for long, so this is prolly a noob error ;)

Code looks like this:

  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;
  }


See this link - it talks about same problem. There are answers there; however, it concludes with:

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* ...

Notice, that forum.java.sun.com has moved to Oracle somewhere. I hope this helps. Anyhow, if you find better answer let me know too :-)


In my testing, changing the ByteBuffer into an IntBuffer using ByteBuffer.asIntBuffer() causes you to lose the backing array.

If you use IntBuffer.allocate(tsize*tsize) instead, you should be able to get the backing array.

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());

Produces:

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜