Ответ 1
Вы можете позволить вашему собственному методу вернуть количество записанных байтов. Затем обновите ByteBuffer соответственно на стороне Java.
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);
}
...
}
}
Edit
Попытка установить предельное значение на стороне 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.