2

我正在开发一个项目,我想在 Android SDK 级别和 Android NDK 级别之间发送一个字节缓冲区。

推荐的方法似乎是使用 ByteBuffer 使用 allocateDirect() 方法,即在 SDK 级别执行:

ByteBuffer frameBuf = ByteBuffer.allocateDirect( 10000 );
int frameSize = fillMyArrayMethod(frameBuf.array());
UseArrayInNdk(frameBuf);

在我的 ICS 手机上一切正常,但是在我朋友的 Android 2.3.3 版本上,代码崩溃了。

调查发现,2.3.3版本手机上抛出UnsupportedOperationException异常的是ByteBuffer的array()方法。

显然 Honeycomb 以下的 Android 版本不支持此方法。

因此,由于我无法获得指向缓冲区的数组指针,我现在不得不在我的 NDK 中使用它之前为数组中的所有数据创建一个额外的 put(),即像这样:

ByteBuffer frameBuf = ByteBuffer.allocateDirect( 10000 );
Byte[] tmpBuf = new byte[10000];
int frameSize = fillMyArrayMethod(tmpBuf);

for (int i=0; i<frameSize; i++)
{
    frameBuf.put(i, tmpBuf[i]);
}
UseArrayInNdk(frameBuf);

好吧,在 Android Honeycomb 及以上代码上执行此操作很好,但在 2.3.3 及以下版本是否有更智能的方法来避免额外的复制?

4

1 回答 1

0

Dalvik 实现的变化是直接字节缓冲区在 ICS 之前没有由数组支持。不能保证在以后的版本中可以调用 array()。使用ByteBuffer. _ 即使您不能直接使用数组,也可以像为 ICS 编码的方式一样,始终使用批处理put()方法,而无需在循环中调用它。

最后,让我引用 Android JNI 提示页面:根据 VM 中直接字节缓冲区访问的实现方式,从用 Java 编写的代码访问数据可能非常慢。

于 2012-08-15T10:17:18.353 回答