Ok, I have been messing around a bit with this JNI stuff and can't
seem to get it to work. The C# code compiles fine, so it must be the
Java code that fails somehow as I get two errors:

"C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj"
(SignAndroidPackage target) (1) ->
(_CompileJava target) ->
  
obj\Debug\android\src\monodroid\watoolkit\library\login\AccessControlWebAuthActivity_AccessControlJavascriptNotify.java(5,43):
javac error :  cannot find symbol
[C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj]
obj\Debug\android\src\monodroid\watoolkit\library\login\AccessControlWebAuthActivity_AccessControlJavascriptNotify.java(5,43):
javac error : symbol  : class AccessControlJavascriptNotify
[C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj]
obj\Debug\android\src\monodroid\watoolkit\library\login\AccessControlWebAuthActivity_AccessControlJavascriptNotify.java(5,43):
javac error : location: package monodroid.watoolkit.library.login
[C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj]
obj\Debug\android\src\monodroid\watoolkit\library\login\AccessControlWebAuthActivity_AccessControlJavascriptNotify.java(5,43):
javac error :   extends
monodroid.watoolkit.library.login.AccessControlJavascriptNotify
[C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj]
obj\Debug\android\src\monodroid\watoolkit\library\login\AccessControlWebAuthActivity_AccessControlJavascriptNotify.java(5,43):
javac error :  
[C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj]
  
obj\Debug\android\src\monodroid\watoolkit\library\login\AccessControlWebAuthActivity_AccessControlJavascriptNotify.java(15,2):
error :  method does not override or implement a method from a
supertype 
[C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj]
obj\Debug\android\src\monodroid\watoolkit\library\login\AccessControlWebAuthActivity_AccessControlJavascriptNotify.java(15,2):
error :         @Override
[C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj]
obj\Debug\android\src\monodroid\watoolkit\library\login\AccessControlWebAuthActivity_AccessControlJavascriptNotify.java(15,2):
error :  
[C:\Users\tcielecki\Desktop\MonoDroid.WAToolkit\MonoDroid.WAToolkit\MonoDroid.WAToolkit.Sample.csproj]

Seems to me that it cannot find the java file I created even though I
have set the build action to AndroidJavaSource, can it have anything
to do with that I am doing this in a Mono for Android Class Library?

I have tried to follow the Adder/ManagedAdder samples very closely and
came up with this code, and as I said it compiles just fine.

AccessControlJavascriptNotify.java:

        package monodroid.watoolkit.library.login;

        public class AccessControlJavascriptNotify
        {
                public void notify(String securityTokenResponse) { }
        }
        
ManagedAccessControlJavascriptNotify.cs:

        using System;
        using Android.Runtime;
        
        namespace MonoDroid.WAToolkit.Library.Login
        {
                
[Register("monodroid/watoolkit/library/login/AccessControlJavascriptNotify",
DoNotGenerateAcw = true)]
                public abstract class ManagedAccessControlJavascriptNotify : 
Java.Lang.Object
                {
                        static IntPtr class_ref =
JNIEnv.FindClass("monodroid/watoolkit/library/login/AccessControlJavascriptNotify");
        
                        public ManagedAccessControlJavascriptNotify ()
                        {
                        }

                        public ManagedAccessControlJavascriptNotify(IntPtr 
handle,
JniHandleOwnership transfer)
                        : base (handle, transfer)
                        {
                        }

                        protected override Type ThresholdType
                        {
                                get { return 
typeof(ManagedAccessControlJavascriptNotify); }
                        }

                        protected override IntPtr ThresholdClass
                        {
                                get { return class_ref; }
                        }

                        #region Notify
                        static IntPtr id_notify;

                        [Register("notify", "(Ljava/lang/String;)V", 
"GetNotifyHandler")]
                        public virtual void Notify(string securityTokenResponse)
                        {
                                if (id_notify == IntPtr.Zero)
                                        id_notify = 
JNIEnv.GetMethodID(class_ref, "notify",
"(Ljava/lang/String;)V");
                                if (GetType() == ThresholdType)
                                        JNIEnv.CallVoidMethod(Handle, 
id_notify, new JValue[] { new
JValue(new Java.Lang.String(securityTokenResponse)) });
                                else
                                        
JNIEnv.CallNonvirtualObjectMethod(Handle, ThresholdClass,
id_notify, new JValue[] { new JValue(new
Java.Lang.String(securityTokenResponse)) });
                        }

#pragma warning disable 0169
                        static Delegate cb_notify;
                        static Delegate GetNotifyHandler()
                        {
                                if (cb_notify == null)
                                        cb_notify = 
JNINativeWrapper.CreateDelegate((Action<IntPtr,
IntPtr, string>)n_Notify);
                                return cb_notify;
                        }

                        static void n_Notify(IntPtr jnienv, IntPtr lrefThis, 
string a)
                        {
                                ManagedAccessControlJavascriptNotify __this =
Java.Lang.Object.GetObject<ManagedAccessControlJavascriptNotify>(lrefThis,
JniHandleOwnership.DoNotTransfer);
                                __this.Notify(a);
                        }
                        #endregion
#pragma warning restore 0169
                }
        }

And in my activity where I need this I have done:

        public class AccessControlJavascriptNotify :
ManagedAccessControlJavascriptNotify
        {
            public override void Notify(string securityTokenResponse)
            {
                base.Notify(securityTokenResponse);
            }
        }

Any Ideas?


On Thu, Jan 5, 2012 at 8:38 PM, Tomasz Cielecki <tom...@ostebaronen.dk> wrote:
> Thank you Jon,
>
> I will see if I can get this to work.
>
> On Jan 5, 2012 6:53 PM, "Jonathan Pryor" <j...@xamarin.com> wrote:
>>
>> On Jan 5, 2012, at 4:50 AM, Tomasz Cielecki wrote:
>> > I am trying to add a javascript interface to my webview but it the
>> > method in the object I pass to the webview does not get triggered.
>> ...
>> > I was thinking whether it is possible to tell mandroid to put the
>> > methods in the generated Java files, so that Java knows of them.
>>
>> Yes, though as you saw it breaks because the Android Callable Wrapper use
>> @Override, which breaks you.
>>
>> The solution [0] is a level of indirection: declare a Java-side interface,
>> then bind that interface in C# and implement it. You'll still need to write
>> some Java code, but only the interface declaration.
>>
>> Unfortunately, binding interfaces is more complicated. Fortunately, I have
>> a sample:
>>
>>
>>  https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/Adder.java
>>
>>  https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/ManagedAdder.cs
>>
>> I also have docs, but those are awaiting review.
>>
>>  - Jon
>>
>> [0] Yes, this isn't a very good solution. We'll be working on improving
>> this in future releases.
>>
>> _______________________________________________
>> Monodroid mailing list
>> Monodroid@lists.ximian.com
>>
>> UNSUBSCRIBE INFORMATION:
>> http://lists.ximian.com/mailman/listinfo/monodroid



-- 
Med Venlig Hilsen / With Best Regards
Tomasz Cielecki
http://ostebaronen.dk
_______________________________________________
Monodroid mailing list
Monodroid@lists.ximian.com

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

Reply via email to