你可以让你的本地方法返回写入的字节数。然后在Java端相应地更新ByteBuffer。
public class SomeClass {
/**
* @param buffer input/output buffer
* @return number of bytes written to buffer
*/
private native int nativeMethod(ByteBuffer buffer);
public void myMethod() {
ByteBuffer buffer = ByteBuffer.allocateDirect(100);
int written = nativeMethod(buffer);
if (written > 0) {
buffer.limit(written);
}
...
}
}
编辑
试行设置在C面是工作太限值,所以我不知道为什么你有它的问题。
幼稚的做法(没有缓存等):
static jint nativeMethod(JNIEnv *env, jobject obj, jobject buffer) {
jclass cls = env->GetObjectClass(buffer);
jmethodID mid = env->GetMethodID(cls, "limit", "(I)Ljava/nio/Buffer;");
char *buf = (char*)env->GetDirectBufferAddress(buffer);
jlong capacity = env->GetDirectBufferCapacity(buffer);
int written = 0;
// Do something spectacular with the buffer...
env->CallObjectMethod(buffer, mid, written);
return written;
}
在Java方面检查时,限制设置的缓冲。
应该工作,这是整个想法。你在Java中看到了什么样的位置和极限值,以及它们如何以及它们的值? – EJP