Hi again,

I think I have narrowed it down to occur when trying to do this in a
Mono for Android Class Library project. If I put the code in a normal
project it compiles the Java code fine. Any reason to why it won't
work with a Class Library project?

On Mon, Jan 9, 2012 at 10:57 AM, Tomasz Cielecki <tom...@ostebaronen.dk> wrote:
> 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



-- 
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