如何从java传递给jni的字节缓冲区中进行写和读
how to write and read from bytebuffer passing from java to jni
我的android项目需要帮助。我想将一个缓冲区从java传递给jni,我的C++代码将填充数据。然后java会将它们显示在屏幕上。我对C++不太熟悉,也不知道如何写入缓冲区。
这就是我得到的。在java 中
ByteBuffer bb = ByteBuffer.allocateDirect(216);
IssmJni.processBuffer(bb);
本地方法
public static native void processBuffer(ByteBuffer bb);
我不使用jni_onload,所以没有javah在C++中
static void fillBuffer(JNIEnv *env, jclass clazz, jobject buf)
{
double *dBuf = env->GetDirectBufferAddress(env, buf);
}
我被困在这里了,我能做双倍的dbuf吗?还是必须是一个字符?
假设我想给这个dbuf写1,2,3,4,5,我该怎么做?我在想dbuf.put(1)。。。dbuf.put(5),但它不起作用。填充后,我是否只调用java中的bb.get(position)?
有人帮我澄清一下,举个例子就好了谢谢
这是我的原生方法表
静态JNINativeMethod method_table[]={
{"fac" , "(J)J" , (void *) factorial},
{"getBuffer", "()[D" , (void *) getBufferNative},
//{"processBuffer", "(Ljava/nio/ByteBuffer)V", (void *) fillBuffer}};
除最后一个外,其他两个都很好。
我不使用jni_onload,所以C++中没有javah
这可能与你的问题无关,但你必须做其中之一。您要么需要在onLoad函数中进行Java到Native方法映射,要么使用javah生成JNI可以在运行时获取的方法签名。否则,您的本机方法将永远不会被调用。
然而,如果您的本机方法被正确地调用,那么您所做的一切都可能是好的。
我被困在这里,我能做双倍dbuf吗?还是必须是一个字符?
函数的返回值实际上是一个void*
,因此您可以将它强制转换为您想要的任何指针类型,因为它只是一个内存地址。然而,直接缓冲区的实际数据类型将是jbyte
,这是signed char
的typedef,因此以下可能是最好的:
jbyte *dBuf = env->GetDirectBufferAddress(env, buf);
假设我想写1,2,3,4,5到这个dbuf,我该怎么做?
C/C++中访问数组中值的表示法使用[]表示法,即:
jbyte *dBuf = env->GetDirectBufferAddress(env, buf);
dBuf[0] = 63;
dBuf[1] = 127;
// ...and so on...
,填充后,我是否只调用java中的bb.get(position)?
是的,您可以使用ByteBuffer
上的访问器方法来访问您从本机代码中写入的数据。
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 从原始字节解码协议缓冲区(以 C++为单位)
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 将constexpr字节数组与缓冲区的一部分(指向数据的指针)进行比较
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- Fread C++ in C#.我知道我需要字节缓冲区,但并不完全在那里
- 如何通过1024字节缓冲区和强力冲洗在插座连接上发送6个字符的C弦
- 将缓冲区与 N 字节边界对齐,而不是 2N 字节边界?
- std::字符串与字节缓冲区(C++的差异)
- 删除字节数组 : Qt 缓冲区之间的空字符 (\x00)
- 浅拷贝到协议缓冲区的字节字段中
- InternetReadFile 填充缓冲区,但返回零字节读取
- 平面缓冲区:访问冲突:字节序标量
- 缓冲区视图中的字节偏移量大于字节长度
- 将数组与传入的字节*缓冲区进行比较的最快方法
- 在内存(C 和/或 C++)中创建和管理字节缓冲区,该缓冲区可以根据需要自动调整大小
- 高效生成字节缓冲区,而不会破坏严格的混叠
- 如何在 Poco C++ 中复制缓冲区字节块
- DirectX 11追加缓冲区字节宽度