internal JniClass(JniEnvironment environment, IntPtr handle, JniObjectLifecycle lifecycle) : base(environment, handle, lifecycle) { // TODO - make this instance global??? if (!mStaticsInitialized) { mStaticsInitialized = true; JniClass localClassClass = this.GetObjectClass(environment); // NOTE: no need to NewGlobalRef class handle for java.lang.Class, will not be unloaded mGetNameMid = localClassClass.GetMethodId(environment, "getName", "()Ljava/lang/String;"); } }
protected internal JniObject(JniEnvironment environment, IntPtr handle, JniObjectLifecycle lifecycle) { if (handle == IntPtr.Zero) { throw new JniException("TODO"); } if (lifecycle == JniObjectLifecycle.Dead) { throw new JniException("Invalid starting state"); } mHandle = handle; mLifeCycle = lifecycle; if (mLifeCycle == JniObjectLifecycle.Local) { environment.AddToCurrentFrame(this); } else if (mLifeCycle == JniObjectLifecycle.LocalJ2N) { mWillFinalize = false; GC.SuppressFinalize(this); } }
internal JniByteArray(JniEnvironment environment, IntPtr handle, JniObjectLifecycle lifecycle) : base(environment, handle, lifecycle) { }
internal JniThrowable(JniEnvironment environment, IntPtr handle, JniObjectLifecycle lifecycle) : base(environment, handle, lifecycle) { }
internal JniObjectArray(JniEnvironment environment, IntPtr handle, JniObjectLifecycle lifecycle, int arrayRank, JniType elementType) : base(environment, handle, lifecycle) { mArrayRank = arrayRank; mElementType = elementType; }
internal JniString(JniEnvironment environment, IntPtr handle, JniObjectLifecycle lifecycle) : base(environment, handle, lifecycle) { }
private JniObject MakeNew(JniEnvironment environment, JniObjectLifecycle target, bool releaseThis) { VerifyAlive(); VerifyEnvironment(environment); IntPtr result = IntPtr.Zero; if (target == JniObjectLifecycle.Global || target == JniObjectLifecycle.GlobalAutoRelease) { result = JniEnvironment.Functions.NewGlobalRef(environment.Handle, this.Handle); } else if (target == JniObjectLifecycle.Local) { result = JniEnvironment.Functions.NewLocalRef(environment.Handle, this.Handle); } if (result == IntPtr.Zero) { JniThrowable.CheckException(environment); } // TODO - create correct type JniObject newObject = JniObject.CreateObjectOfType(environment, result, this, target); if (releaseThis) { this.Release(environment); } return newObject; }
private void MakeDead() { this.mLifeCycle = JniObjectLifecycle.Dead; this.mHandle = IntPtr.Zero; if (mWillFinalize) { GC.SuppressFinalize(this); mWillFinalize = false; } }
private static JniObject CreateObjectOfType(JniEnvironment environment, IntPtr handle, JniConcreteObjectType concreteType, JniObjectLifecycle lifecycle) { switch (concreteType) { case JniConcreteObjectType.Object: return new JniObject(environment, handle, lifecycle); case JniConcreteObjectType.String: return new JniString(environment, handle, lifecycle); case JniConcreteObjectType.Class: return new JniClass(environment, handle, lifecycle); case JniConcreteObjectType.Throwable: return new JniThrowable(environment, handle, lifecycle); case JniConcreteObjectType.BooleanArray: return new JniBooleanArray(environment, handle, lifecycle); case JniConcreteObjectType.ByteArray: return new JniByteArray(environment, handle, lifecycle); case JniConcreteObjectType.CharArray: return new JniCharArray(environment, handle, lifecycle); case JniConcreteObjectType.DoubleArray: return new JniDoubleArray(environment, handle, lifecycle); case JniConcreteObjectType.IntArray: return new JniIntArray(environment, handle, lifecycle); case JniConcreteObjectType.FloatArray: return new JniFloatArray(environment, handle, lifecycle); case JniConcreteObjectType.LongArray: return new JniLongArray(environment, handle, lifecycle); case JniConcreteObjectType.ShortArray: return new JniShortArray(environment, handle, lifecycle); case JniConcreteObjectType.ObjectArray: return new JniObjectArray(environment, handle, lifecycle, -1, JniType.Null); default: throw new JniException("TODO"); } }
private static JniObject CreateObjectOfType(JniEnvironment environment, IntPtr handle, JniObject originalObject, JniObjectLifecycle lifecycle) { if (originalObject.ConcreteType == JniConcreteObjectType.ObjectArray) { JniObjectArray objectArray = originalObject as JniObjectArray; return new JniObjectArray(environment, handle, lifecycle, objectArray.ArrayRank, objectArray.ElementType); } return CreateObjectOfType(environment, handle, originalObject.ConcreteType, lifecycle); }