Java android bytebuffer作为intbuffer-asarray总是给出不支持的操作异常

Java android bytebuffer作为intbuffer-asarray总是给出不支持的操作异常,java,android,bytebuffer,Java,Android,Bytebuffer,我试图获取一组mipmaplevel并保存到本地缓存文件中,以避免每次重建它们(并且预生成它们是不实际的…) 我已经将mipmaplevels写入了一组位图中,现在我想将它们写入缓存文件,但是无论我使用何种类型的缓冲区(直接或不直接,设置字节顺序或不设置字节顺序),hasArray在intbuffer上总是返回false。我一定是在做些傻事,但我再也看不见树木了 使用java的时间不长,因此这可能是一个noob错误;) 代码如下所示: int tsize = 256; ByteBuffe

我试图获取一组mipmaplevel并保存到本地缓存文件中,以避免每次重建它们(并且预生成它们是不实际的…)

我已经将mipmaplevels写入了一组位图中,现在我想将它们写入缓存文件,但是无论我使用何种类型的缓冲区(直接或不直接,设置字节顺序或不设置字节顺序),hasArray在intbuffer上总是返回false。我一定是在做些傻事,但我再也看不见树木了

使用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;
  }
inttsize=256;
ByteBuffer xbb=ByteBuffer.allocate(tsize*tsize*4);
//或任何其他种类的创建,如包装等,没有区别
xbb.order(ByteOrder.nativeOrder());//入内或出-没有区别
IntBuffer ib=xbb.asIntBuffer();
对于(int i=0;i
请参见-它讨论了相同的问题。这里有答案;然而,它的结论是:

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的某个位置。
我希望这有帮助。无论如何,如果您找到更好的答案,请让我也知道:-)

在我的测试中,使用
ByteBuffer.asIntBuffer()
ByteBuffer
更改为
IntBuffer
,会导致您丢失备份数组

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());
如果改用
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

使用bitmap.copypixels会有所帮助,但在不复制的情况下驱动io还是更好……仍然使用copypixels。。。总有一天,我们必须努力寻找更好的答案!