/// <summary> /// The buffer will be pinned and shared with java /// user is responsible for thread synchronization. /// </summary> public DirectByteBuffer(byte[] sharedBuffer, int position, int len) : base(null) { Init(); cleaner = new DirectBufferCleaner(sharedBuffer); JNIEnv env = JNIEnv.ThreadEnv; long offset = cleaner.Address.ToInt64() + position; ByteBuffer buffer; if (Bridge.Setup.BindNative && ctor != null) { // sun JVM specific Object wrap = Bridge.WrapCLR(cleaner); if (jdk6) { buffer = (ByteBuffer)env.NewObject(dbClazz, ctor, new Value { _int = len }, new Value { _long = offset }, new Value { _object = wrap.jvmHandle }); } else { buffer = (ByteBuffer)env.NewObject(dbClazz, ctor, new Value { _int = len }, new Value { _long = offset }, new Value { _object = JniHandle.Zero }, //FileDescriptor new Value { _object = wrap.jvmHandle } ); } ((IJvmProxy)wrap).JvmHandle.HoldThisHandle(); } else { // TODO ? // the buffer could disapear when collected by CLR gc buffer = env.NewDirectByteBuffer(new IntPtr(cleaner.Address.ToInt64() + position), len); } buffer.order(ByteOrder.LITTLE_ENDIAN); ((IJvmProxy)this).Copy(env, buffer.jvmHandle); }
/// <summary> /// The buffer will be pinned and shared with java /// user is responsible for thread synchronization. /// </summary> public DirectByteBuffer(byte[] sharedBuffer, int position, int len) : base(null) { Init(); cleaner = new DirectBufferCleaner(sharedBuffer); JNIEnv env = JNIEnv.ThreadEnv; long offset = cleaner.Address.ToInt64() + position; ByteBuffer buffer; if (Bridge.Setup.BindNative && ctor!=null) { // sun JVM specific Object wrap = Bridge.WrapCLR(cleaner); if (jdk6) { buffer = (ByteBuffer)env.NewObject(dbClazz, ctor, new Value { _int = len }, new Value { _long = offset }, new Value { _object = wrap.jvmHandle }); } else { buffer = (ByteBuffer)env.NewObject(dbClazz, ctor, new Value { _int = len }, new Value { _long = offset }, new Value { _object = JniHandle.Zero }, //FileDescriptor new Value { _object = wrap.jvmHandle } ); } ((IJvmProxy)wrap).JvmHandle.HoldThisHandle(); } else { // TODO ? // the buffer could disapear when collected by CLR gc buffer = env.NewDirectByteBuffer(new IntPtr(cleaner.Address.ToInt64() + position), len); } buffer.order(ByteOrder.LITTLE_ENDIAN); ((IJvmProxy)this).Copy(env, buffer.jvmHandle); }