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
Monodroid@lists.ximian.com

UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid

Reply via email to