JNI如何从GetDirectBufferAddress增加指针

时间:2013-12-23 05:03:01

标签: java c java-native-interface

假设我有以下本机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然后再使用它。

1 个答案:

答案 0 :(得分:1)

是的,你的例子没问题。这就是指针算术的工作原理。但要小心:你的自律是唯一能够保持在原始直接缓冲区范围内的保护。例如。对于上面的示例,请确保r_directbuffer长度至少为14个字节。

不要混淆:buffer_address上的操作不会改变你获得指针的 DirectByteBuffer 。此外,JNI不会将指针的生命周期与作业同步。


不,您无法在buffer_address上使用GetByteArrayRegion()。您甚至无法在r_directbuffer上使用它,尽管它更接近。您只能在Java字节数组上使用它, jbyteArray byte [] 类型的 jobject