Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }