分配本机缓冲区并在 JAVA 中使用?

Posted

技术标签:

【中文标题】分配本机缓冲区并在 JAVA 中使用?【英文标题】:alloc native buffer and use in JAVA? 【发布时间】:2013-04-18 07:12:22 【问题描述】:

我有位图,我应该在 c++ 和 Java 方面都可以操作它。 因此,根据this 的帖子,我在 C++ 中分配了缓冲区并将引用传递给 Java。在 Java 中,我使用 copyPixelsToBuffer 方法从位图填充缓冲区。当我尝试从该缓冲区创建位图(没有任何操作)时,decodeByteArray 返回 null。而且我不明白我的错误是什么。在我使用的代码下方。

 BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    mCurrentBitmap = BitmapFactory.decodeFile(hardCodedPath, options);

    // 4- bytes count per pixel
    bytesCount = mCurrentBitmap.getWidth() * mCurrentBitmap.getHeight() * 4;

    pixels = (ByteBuffer) allocNativeBuffer(bytesCount);
    pixels.order(ByteOrder.nativeOrder());

    mCurrentBitmap.copyPixelsToBuffer(pixels);
    pixels.flip();
    pixels.order(ByteOrder.BIG_ENDIAN);
    byte[] bitmapdata = new byte[pixels.remaining()];

    pixels.get(bitmapdata);

    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inDither = true;
    opt.inPreferredConfig = Bitmap.Config.ARGB_8888;

    Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata, 0, bitmapdata.length, opt);

感谢任何 cmets 和建议。

【问题讨论】:

【参考方案1】:

这是我的做法。

ByteBuffer mPixels = ByteBuffer.allocateDirect( saveWidth*saveHeight*4).order(ByteOrder.nativeOrder()); GLES20.glReadPixels(0, 0, mWidth, mHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, mPixels);

resultBitmap = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
 resultBitmap.copyPixelsFromBuffer(mPixels);

【讨论】:

以上是关于分配本机缓冲区并在 JAVA 中使用?的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO -- 直接缓冲区与非直接缓冲区

为外部 dll 上的缓冲区分配内存并在主应用程序上使用它是不是安全?

NIO直接缓冲区和非直接缓冲区

在 Java 服务和本机应用程序之间共享缓冲区,访问开销最小

从 .NET 程序集透明地访问本机内存

Java NIO使用及原理分析 来自网上资料整理