示例#1
0
        public ByteArrayWithLength this[string fname]
        {
            get
            {
                //ConsoleExtensions.trace("enter argsByteArray");

                var iscopy = default(bool);

                var fields_GetType = env.GetObjectClass(env, fields);
                var fref           = env.GetFieldID(env, fields_GetType, fname, "[B");

                var v = env.GetObjectField(env, fields, fref);

                // I/DEBUG   ( 2940): Abort message: 'sart/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: jarray was NULL'

                if (v == null)
                {
                    ConsoleExtensions.tracei("new Buffer null");
                }
                else
                {
                    var len = env.GetArrayLength(env, v);
                    //ConsoleExtensions.tracei("GetArrayLength", len);
                    if (len > 0)
                    {
                        if (Buffer == null)
                        {
                            // first timer. easy.
                            BufferLength = len;
                            Buffer       = new byte[len];

                            ConsoleExtensions.tracei("new Buffer ", len);


                            //jni/OVRWindWheelNDK.dll.c:471:135: error: 'flag4' undeclared (first use in this function)
                            //         byte_5 = (/* typecast */(unsigned char*(*)(JNIEnv*, void*, int*))(*__that->env)->GetByteArrayElements)(__that->env, object2, &flag4);
                            var loc = env.GetByteArrayElements(env, v, out iscopy);

                            if (loc != null)
                            {
                                for (int i = 0; i < len; i++)
                                {
                                    Buffer[i] = loc[i];
                                }

                                env.ReleaseByteArrayElements(env, v, loc);
                            }
                        }
                        else
                        {
                            // same size... no redim.
                            //ConsoleExtensions.tracei("reuse Buffer ", len);


                            //Array.Resize(ref this.Buffer, len);

                            // A pointer to the reallocated memory block, which may be either the same as ptr or a new location.

                            if (BufferLength != len)
                            {
                                this.Buffer       = stdlib_h.realloc(this.Buffer, len);
                                this.BufferLength = len;
                            }

                            var loc = env.GetByteArrayElements(env, v, out iscopy);
                            if (loc != null)
                            {
                                for (int i = 0; i < len; i++)
                                {
                                    Buffer[i] = loc[i];
                                }

                                env.ReleaseByteArrayElements(env, v, loc);
                            }
                        }
                    }
                }

                //env.SetLongField(env, fields, fref, value);

                var copyout = new ByteArrayWithLength {
                    Buffer = this.Buffer, BufferLength = this.BufferLength
                };

                return(copyout);
            }
        }