假设我有以下本机JNI代码,其中我获取直接缓冲区的地址
char* buffer_address = (char *)(*env)->GetDirectBufferAddress(env,(jobject)r_directbuffer);
增加指针buffer_address是否合法?就像我们在C
中做的那样buffer_address+=4; //increments the pointer 4 bytes
后来我想将这个递增的指针传递给其他函数,让我们说memcpy
memcpy(buffer_address, src, 10); // 10 bytes to copy
那么如何做这些事情,我不想将buffer_address的全部内容复制到本机C然后再使用它。
答案 0 :(得分:1)
是的,你的例子没问题。这就是指针算术的工作原理。但要小心:你的自律是唯一能够保持在原始直接缓冲区范围内的保护。例如。对于上面的示例,请确保r_directbuffer
长度至少为14个字节。
不要混淆:buffer_address
上的操作不会改变你获得指针的 DirectByteBuffer 。此外,JNI不会将指针的生命周期与作业同步。
不,您无法在buffer_address
上使用GetByteArrayRegion()。您甚至无法在r_directbuffer
上使用它,尽管它更接近。您只能在Java字节数组上使用它, jbyteArray 或 byte [] 类型的 jobject 。