JNI从ByteBuffer获取数据,返回byte[]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNI从ByteBuffer获取数据,返回byte[]相关的知识,希望对你有一定的参考价值。

参考技术A 实现类似Java的 Bytebuffer.get(byte[] data); 的功能

Java对应的Native方法

如何将 byte[] 转换为 bytebuffer 本机内存?

【中文标题】如何将 byte[] 转换为 bytebuffer 本机内存?【英文标题】:How to convert byte[] to bytebuffer native memory? 【发布时间】:2011-07-28 07:06:53 【问题描述】:

我需要将大量内存传递给 jni 端来解析它。 我之前使用 GetByteArrayElements 来获取本机指针。但我发现这种方法总是复制内存,而不是直接使用内存。 所以我使用 GetDirectBufferAddress 直接获取内存以避免内存复制。 这就要求必须使用 allocateDirect 方法来分配内存。 但是给我的内存是字节数组,不是本机内存。 有没有办法将 byte[] 转换为 bytebuffer? 谢谢。

【问题讨论】:

您正在获取数据并从 VM(原始数组)内部移动到 VM 外部的位置(本机操作系统内存空间)——不幸的是,当数据在“血脑”屏障。 【参考方案1】:

不幸的是,您将不得不使用put 并将您的字节数组复制到使用allocateDirect 分配的缓冲区中。

【讨论】:

那真的很不幸。内存复制无法避免,在java端或jni端。

以上是关于JNI从ByteBuffer获取数据,返回byte[]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 byte[] 转换为 bytebuffer 本机内存?

从 ByteBuffer 获取到 byte[] 不写入到 byte[]

JNI - 来自 C++ 的免费 ByteBuffer

如何在 JNI 中将 char[] 转换为 ByteBuffer?

Android jni 数据类型丢失精度(ByteBuffer,int)

Java - ByteBuffer 或 ArrayList<Byte>?