On Aug 12, 2011, at 8:56 AM, malexandroni wrote:
> I tried the JS interface in Java and it works fine, but I tried to replicate
> the code in Mono for Android and it does not work. What am I doing wrong?
That won't work at this point in time. :-(
The problem is reflection: in order for the JavaScript to invoke the method on
the provided Java object, Android uses Java reflection in order to see if the
method exists, and if it does to then invoke the method. This works in Java
because the JavaScriptInterface type has a `showToast` method.
This doesn't work in Mono for Android, because `mandroid` only generates Java
method declarations for methods that override base class methods or implement
interface methods. Consequently, your C# JavaScriptInterface.showToast() method
isn't visible to the Java world, and things don't work. (To see what I mean,
look at obj\Debug\android\src\**\JavaScriptInterface.java, and see what methods
are present.)
We intent to support this in a future release (timeframe: unspecified), but
that doesn't help _now_.
What will help now is a workaround: write your JavaScriptInterface type in a
.java file, include the .java file in your project with a AndroidJavaSource
Build action, and in Activity1.OnCreate(), do:
IntPtr JavaScriptInterface_Class = JNIEnv.FindClass
("the/package/for/JavaScriptInterface");
// TODO: Update "the/package/for" as appropriate for your type.
IntPtr JavaScriptInterface_ctor = JNIEnv.GetMethodID
(JavaScriptInterface_Class, "<init>", "()V");
IntPtr instance = JNIEnv.NewObject (JavaScriptInterface_Class,
JavaScriptInterface_ctor);
appView.AddJavascriptInterface (new Java.Lang.Object (instance),
"Android");
- Jon
_______________________________________________
Monodroid mailing list
[email protected]
UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid