[Mono-bugs] [Bug 655342] System.InvalidOperationException When Inheriting From IntentService
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Wed Dec 8 16:09:49 EST 2010
https://bugzilla.novell.com/show_bug.cgi?id=655342
https://bugzilla.novell.com/show_bug.cgi?id=655342#c7
Jonathan Pryor <jpryor at novell.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|REOPENED |RESOLVED
Resolution| |WONTFIX
--- Comment #7 from Jonathan Pryor <jpryor at novell.com> 2010-12-08 21:09:48 UTC ---
This, in general, is currently unsolvable in the general case:
1. Java constructors can't be `native`.
2. Consequently, monodroid MUST generate _something_ for the Java proxy
constructor body.
3. javac requires an implicit or explicit super() call
4. When no default base constructor is present, super() is required.
As a result of 1-4, the Java Proxy for MyIntentService (comment 5) would need
to be:
public MyIntentService ()
{
super(???);
if (getClass () == MyIntentService.class)
mono.android.TypeManager.Activate (...);
}
Now tell me, what should `???` be? In this case, `null` is the obvious answer,
and it would actually work. However consider android.accounts.Account:
// C#
public class MyAccount : Android.Accounts.Account {
public MyAccount () : base ("name", "type") {}
}
// Java Proxy
...
public MyAccount () {
super (null);
// ...
}
IIF Android creates a MyAccount instance, then the MyAccount constructor will
pass null to the Account(Parcel) constructor, which will result in a
java.lang.NullPointerException:
http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/accounts/Account.java;h=7b83a3076db336d53bb8d3eef65eb799ed96ff39;hb=HEAD#l57
Oops. Not that using the Account(String,String) constructor would be any
better; that just results in an InvalidArgumentException.
The result is that, for SOME types, if Android creates them via the default
constructor then construction will FAIL and the C# constructor will never be
invoked.
Just to make things inconsistent, creating MyAccount from C# would be perfectly
fine; it's only if the instance is created from Android/Java that things will
break.
(Sounds like a great debugging excursion, doesn't it?)
There is only one way to sanely make this work -- and monodroid can't do it --
is to write custom Java code which subclasses e.g. Account and provides a
default constructor, which can provide the appropriate (Java-side) parameters.
Then it becomes a matter of getting your C# code to reference your Java code,
which something we need to better flesh out and document.
--
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
More information about the mono-bugs
mailing list