protected ReturnType _Call <ReturnType>(string methodName, params object[] args) { ReturnType local; if (args == null) { args = new object[1]; } IntPtr methodID = AndroidJNIHelper.GetMethodID <ReturnType>(this.m_jclass, methodName, args, false); jvalue[] jvalueArray = AndroidJNIHelper.CreateJNIArgArray(args); try { if (AndroidReflection.IsPrimitive(typeof(ReturnType))) { if (typeof(ReturnType) == typeof(int)) { return((ReturnType)AndroidJNISafe.CallIntMethod(this.m_jobject, methodID, jvalueArray)); } if (typeof(ReturnType) == typeof(bool)) { return((ReturnType)AndroidJNISafe.CallBooleanMethod(this.m_jobject, methodID, jvalueArray)); } if (typeof(ReturnType) == typeof(byte)) { return((ReturnType)AndroidJNISafe.CallByteMethod(this.m_jobject, methodID, jvalueArray)); } if (typeof(ReturnType) == typeof(short)) { return((ReturnType)AndroidJNISafe.CallShortMethod(this.m_jobject, methodID, jvalueArray)); } if (typeof(ReturnType) == typeof(long)) { return((ReturnType)AndroidJNISafe.CallLongMethod(this.m_jobject, methodID, jvalueArray)); } if (typeof(ReturnType) == typeof(float)) { return((ReturnType)AndroidJNISafe.CallFloatMethod(this.m_jobject, methodID, jvalueArray)); } if (typeof(ReturnType) == typeof(double)) { return((ReturnType)AndroidJNISafe.CallDoubleMethod(this.m_jobject, methodID, jvalueArray)); } if (typeof(ReturnType) == typeof(char)) { return((ReturnType)AndroidJNISafe.CallCharMethod(this.m_jobject, methodID, jvalueArray)); } } else { if (typeof(ReturnType) == typeof(string)) { return((ReturnType)AndroidJNISafe.CallStringMethod(this.m_jobject, methodID, jvalueArray)); } if (typeof(ReturnType) == typeof(AndroidJavaClass)) { return((ReturnType)AndroidJavaClassDeleteLocalRef(AndroidJNISafe.CallObjectMethod(this.m_jobject, methodID, jvalueArray))); } if (typeof(ReturnType) == typeof(AndroidJavaObject)) { return((ReturnType)AndroidJavaObjectDeleteLocalRef(AndroidJNISafe.CallObjectMethod(this.m_jobject, methodID, jvalueArray))); } if (!AndroidReflection.IsAssignableFrom(typeof(Array), typeof(ReturnType))) { throw new Exception("JNI: Unknown return type '" + typeof(ReturnType) + "'"); } return(AndroidJNIHelper.ConvertFromJNIArray <ReturnType>(AndroidJNISafe.CallObjectMethod(this.m_jobject, methodID, jvalueArray))); } local = default(ReturnType); } finally { AndroidJNIHelper.DeleteJNIArgArray(args, jvalueArray); } return(local); }