blob: ae86252e0dc1d2d182acd14efc562330343afde7 [file] [log] [blame]
// GNUClasspath-specific JNI implementation
jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity) {
JavaObject* res = 0;
JavaObject* p = 0;
jobject ret = 0;
llvm_gcroot(res, 0);
llvm_gcroot(p, 0);
llvm_gcroot(ret, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* myvm = th->getJVM();
UserClass* BB = myvm->upcalls->newDirectByteBuffer;
res = BB->doNew(myvm);
#if ARCH_32
UserClass* PP = myvm->upcalls->newPointer32;
p = PP->doNew(myvm);
myvm->upcalls->dataPointer32->setInstanceInt32Field(p, (uint32)address);
#elif ARCH_64
UserClass* PP = myvm->upcalls->newPointer64;
p = PP->doNew(myvm);
myvm->upcalls->dataPointer64->setInstanceLongField(p, (jlong)address);
#endif
myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res, 0, &p,
(uint32)capacity,
(uint32)capacity, 0);
ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void *GetDirectBufferAddress(JNIEnv *env, jobject _buf) {
JavaObject* buf = 0;
JavaObject* address = 0;
llvm_gcroot(buf, 0);
llvm_gcroot(address, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
buf = *(JavaObject**)_buf;
Jnjvm* vm = myVM(env);
address = vm->upcalls->bufferAddress->getInstanceObjectField(buf);
if (address != 0) {
#if (__WORDSIZE == 32)
int res = vm->upcalls->dataPointer32->getInstanceInt32Field(address);
#else
jlong res = vm->upcalls->dataPointer64->getInstanceLongField(address);
#endif
RETURN_FROM_JNI((void*)res);
} else {
RETURN_FROM_JNI(0);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}