【问题标题】:How can I get short[] from a ByteBuffer如何从 ByteBuffer 中获取 short[]
【发布时间】:2012-08-09 10:49:31
【问题描述】:

我在一个 Android 项目中使用 JNI 代码,其中 JNI 原生函数需要一个 short[] 参数。但是,原始数据存储为 ByteBuffer。我正在尝试转换数据格式如下。

ByteBuffer rgbBuf = ByteBuffer.allocate(size);
...    
short[] shortArray = (short[]) rgbBuf.asShortBuffer().array().clone();

但是我在运行上面显示的第二行代码时遇到了以下问题:

E/AndroidRuntime(23923): Caused by: java.lang.UnsupportedOperationException
E/AndroidRuntime(23923): at Java.nio.ShortToByteBufferAdapter.protectedArray(ShortToByteBufferAdapter.java:169)

谁能建议一种实现转换的方法?

【问题讨论】:

    标签: android bytebuffer


    【解决方案1】:

    实际上,这样做的方法有点奇怪。您可以按以下方式进行;将其转换为short 数组很重要。

    short[] shortArray = new short[size/2];
    rgbBuf.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shortArray);
    

    此外,您可能必须使用allocateDirect 而不是allocate

    【讨论】:

    • 你能解释一下为什么使用 allocateDirect() 吗?因为我没有从 android 文档中找到任何提示。
    • 这是基于提交的a bug report 的预感。这可能无关紧要,但我认为值得一提。
    【解决方案2】:

    我在使用 asShortBuffer() 的任何东西上都遇到了同样的错误。这是一种解决方法(改编自2 bytes to short java):

    short[] shortArray = new short[rgbBuf.capacity() / 2]);
    for (int i=0; i<shortArray.length; i++)
    {   
        ByteBuffer bb = ByteBuffer.allocate(2);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.put(rgbBuf[2*i]);
        bb.put(rgbBuf[2*i + 1]);
        shortArray[i] = bb.getShort(0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2012-05-22
      相关资源
      最近更新 更多