Re: How to pass a Java callable to C#?

Jeroen Frijters <[email protected]>
Newsgroups gmane.comp.java.ikvm.devel
Message-ID <[email protected]>
The Delegate class I'm talking about is the .NET Delegate base class (cli.System.Delegate from IKVM). It has a bunch of CreateDelegate factory methods. You can't easily use the ones taking a MethodInfo, but you can go from a Java class to a cli.System.Type using ikvm.runtime.Util.getInstanceTypeFromClass(Class).

Regards,
Jeroen

> -----Original Message-----
> From: Doug Blank [mailto:[email protected]]
> Sent: Monday, February 17, 2014 19:36
> To: Jeroen Frijters
> Cc: [email protected]
> Subject: Re: [Ikvm-developers] How to pass a Java callable to C#?
> 
> > BTW, I just realized you can also use one of the static methods on
> > Delegate to create a delegate to the specified method and simply pass
> that.
> 
> 
> Where is "Delegate" and what are its static methods? Sorry for being
> dense... I'm having trouble finding where to begin tackling this.
> 
> I have found that, via Java reflection, I can:
> 
> > widget.getClass().getMethods()
> 
> which shows much of what I am looking for, including that mangled name:
> 
> public final void
> cli.Widgets$Widget.on_click(cli.System.Func$$00602_$$$_Ljava__lang__Obje
> ct_$$_Ljava__lang__Object_$$$$_)
> 
> 
> If I try to make one of those, I get:
> 
> > f = new
> > cli.System.Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_
> > $$$$_()
> 
> ExecutionError: No constructor in
> Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$$$_ matches
> this invocation
>    Arguments: ()
>     Candidate signatures:
> 
> Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$$$_(Func$$0
> 0602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$$$_.Method)
> 
> Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$$$_(Object,
> IntPtr)
> 
> So, I now understand what you meant about generating the Class that
> takes that Method. But if there is an easier method, I would like to do
> it in that manner.
> 
> Thanks!
> 
> -Doug
> 
> On Mon, Feb 17, 2014 at 11:25 AM, Jeroen Frijters <[email protected]
> <mailto:[email protected]> > wrote:
> 
> 
> 	From the Java side, the on_click method signature is:
> 
> 	on_click(Lcli/System/Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__
> lang__Object_$$$$_)V
> 
> 	The ugliness of the name is due to generics, but not really
> relevant to this discussion.
> 
> 	If you reflect on this class, you can determine it is a .NET
> delegate (it extends cli.System.MulticastDelegate and has a nested class
> called Method with a single Invoke method and it (the delegate class)
> has a constructor taking a reference to the inner Method interface).
> 
> 	BTW, I just realized you can also use one of the static methods on
> Delegate to create a delegate to the specified method and simply pass
> that.
> 
> 
> 	Regards,
> 	Jeroen
> 
> 	> -----Original Message-----
> 	> From: Doug Blank [mailto:[email protected]
> <mailto:[email protected]> ]
> 
> 	> Sent: Monday, February 17, 2014 16:25
> 	> To: Jeroen Frijters
> 	> Cc: [email protected] <mailto:ikvm-
> [email protected]>
> 	> Subject: Re: [Ikvm-developers] How to pass a Java callable to C#?
> 	>
> 
> 	> On Sun, Feb 16, 2014 at 8:41 AM, Jeroen Frijters
> <[email protected] <mailto:[email protected]>
> 
> 	> <mailto:[email protected] <mailto:[email protected]> > > wrote:
> 	>
> 	>
> 	>       Hi Doug,
> 	>
> 
> 	>       Your C# on_click method is callable from (IKVM) Java.
> 	>
> 	>       You'll need to generate a class that implements the
> 	>
> cli.System.Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$
> 	> $$_$Method interface.
> 	>
> 	>
> 	>
> 	>
> 	> Jeroen,
> 	>
> 	> Thanks for these details; can you expand a bit on this?
> 	> Where did the name
> 	>
> "cli.System.Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$
> 	> $$$_$Method" come from?
> 	> What is that?
> 	> How do you create an interface that implements it?
> 	>
> 	> I've read and googled looking for details on signatures and IKVM,
> but I
> 	> can't find anything that appears to be relevant.
> 	>
> 	> -Doug
> 	>
> 	>
> 	>       This class can then be instantiated and passed to the
> constructor
> 	> of the
> 	>
> cli.System.Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$
> 	> $$_ class (the delegate) and this object can be passed to the
> on_click
> 	> method.
> 	>
> 	>
> 	>       Regards,
> 	>       Jeroen
> 	>
> 	>       > -----Original Message-----
> 	>       > From: Doug Blank [mailto:[email protected]
> <mailto:[email protected]>
> 	> <mailto:[email protected] <mailto:[email protected]> > ]
> 	>
> 	>       > Sent: Sunday, February 16, 2014 13:46
> 	>       > To: Jeroen Frijters
> 
> 	>       > Cc: [email protected] <mailto:ikvm-
> [email protected]>  <mailto:ikvm- <mailto:ikvm->
> 	> [email protected]
> <mailto:[email protected]> >
> 
> 	>       > Subject: Re: [Ikvm-developers] How to pass a Java
> callable to C#?
> 	>       >
> 	>       > Jeroen,
> 	>       >
> 	>       > Thanks for the feedback, but I think I didn't explain
> very well
> 	> my
> 	>       > problem. The Widget library is written in C# and is being
> used by
> 	> the
> 	>       > Java interpreter (running on the CLR). I wish to be able
> to
> 	> register the
> 	>       > callback in Java.
> 	>       >
> 	>       > This works in IronPython, because IronPython knows how to
> map
> 	> Python
> 	>       > functions onto Func<object,object>:
> 	>       >
> 	>       > """
> 	>       > from Widgets import Widget
> 	>       > def f(obj):
> 	>       >     print("Click!")
> 	>       > w = Widget()
> 	>       > w.on_click(f)
> 	>       > """
> 	>       >
> 	>       > I have the same working in a Scheme running on the CLR,
> because I
> 	> can
> 	>       > define and wrap around callback1 in C#  to map it to
> 	>       > Func<object,object>:
> 	>       >
> 	>       > """
> 	>       > (using "Widgets")
> 	>       > (define f (lambda (obj) (printf "~a\n" obj)) (define w
> (Widget))
> 	>       > (w.on_click (callback1 f)) """
> 	>       >
> 	>       > So, I'm trying to figure out how to do the same thing in
> Java:
> 	> map
> 	>       > something in Java onto Func<object,object>, so something
> like
> 	> this will
> 	>       > work in DynamicJava:
> 	>       >
> 	>       > """
> 	>       > import static cli.Widgets.*;
> 	>       >
> 	>       > public int f(Object widget) {
> 	>       > }
> 	>       >
> 	>       > Widget w = new Widget();
> 	>       > w.on_click(f);
> 	>       > """
> 	>       >
> 	>       > Does ikvm have something built-in to help pass a Java
> function to
> 	> C#? Or
> 	>       > do you have a general strategy for doing this?
> 	>       >
> 	>       > Thanks for any further hints,
> 	>       >
> 	>       > -Doug
> 	>       >
> 	>       >
> 	>       > On Sun, Feb 16, 2014 at 4:21 AM, Jeroen Frijters
> 	> <[email protected] <mailto:[email protected]>
> <mailto:[email protected] <mailto:[email protected]> >
> 	>
> 
> 	>       > <mailto:[email protected] <mailto:[email protected]>
> <mailto:[email protected] <mailto:[email protected]> > > > wrote:
> 	>       >
> 	>       >
> 	>       >       Hi Doug,
> 	>       >
> 	>       >       I'm probably misunderstanding the question, but in
> Java
> 	> you'd use
> 	>       > interfaces for this. See
> 	>       >
> 	>
> http://docs.oracle.com/javase/7/docs/api/java/awt/Button.html#addActionL
> 	>       > istener(java.awt.event.ActionListener) for example.
> 	>       >
> 	>       >       Regards,
> 	>       >       Jeroen
> 	>       >
> 	>       >
> 	>       >       > -----Original Message-----
> 	>       >       > From: Doug Blank [mailto:[email protected]
> <mailto:[email protected]>
> 	> <mailto:[email protected] <mailto:[email protected]> >
> 	>       > <mailto:[email protected]
> <mailto:[email protected]>  <mailto:[email protected]
> <mailto:[email protected]> > > ]
> 	>       >       > Sent: Sunday, February 16, 2014 0:57
> 	>
> 	>       >       > To: [email protected]
> <mailto:[email protected]>  <mailto:ikvm-
> <mailto:ikvm->
> 
> 	> [email protected]
> <mailto:[email protected]> >  <mailto:ikvm- <mailto:ikvm-
> >  <mailto:ikvm- <mailto:ikvm-> >
> 	>       > [email protected]
> <mailto:[email protected]>
> 	> <mailto:[email protected]
> <mailto:[email protected]> > >
> 
> 	>       >       > Subject: [Ikvm-developers] How to pass a Java
> callable to
> 	> C#?
> 	>       >       >
> 	>       >       > I am doing some refining on the DynamicJava
> interpreter
> 	> written
> 	>       > in Java
> 	>       >       > that is running under Mono [1]. (C# libraries are
> made
> 	> available
> 	>       > to the
> 	>       >       > interpreted Java through ikvmstub, and the Java
> 	> interpreter is
> 	>       > running
> 	>       >       > by being compiled with ikvmc). Everything is
> working very
> 	> well,
> 	>       > but one
> 	>       >       > thing I would like to do is be able to pass a
> Java
> 	> callback to a
> 	>       > C#
> 	>       >       > function.
> 	>       >       >
> 	>       >       >
> 	>       >       > The C# code looks like this (although I could
> change it
> 	> in any
> 	>       > manner):
> 	>       >       >
> 	>       >       >
> 	>       >       > public class Widget {
> 	>       >       > public void on_click(System.Func<object,object>
> function)
> 	> {
> 	>       >       >         }
> 	>       >       > }
> 	>       >       >
> 	>       >       > In general, how would a Java program register a
> callback
> 	> to the
> 	>       > C#? I
> 	>       >       > can write an interface on either the Java side,
> or the C#
> 	> side.
> 	>       >       >
> 	>       >       > Thanks for any suggestions,
> 	>       >       >
> 	>       >       > -Doug
> 	>       >       >
> 	>       >       > [1] -
> 	>       >       >
> 	>       >
> 	>
> https://bitbucket.org/ipre/calico/src/master/languages/Java/dynamicjava/
> 	>       >
> 	>       >
> 	>
> 	>
> 	>
> 
> 
> 


------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.