<font face="verdana,sans-serif">Thanks a lot for the detailed answer, Max!<br></font><div><font class="Apple-style-span" face="verdana, sans-serif">This gives me a good idea of how my problem can be solved.<br></font></div>

<div><font class="Apple-style-span" face="verdana, sans-serif"><br></font></div><div><font class="Apple-style-span" face="verdana, sans-serif">I&#39;m actually not working on a specific project involving this</font></div>

<div><font class="Apple-style-span" face="verdana, sans-serif">problem right now. What I&#39;m mostly looking for is a small example</font></div><div><font class="Apple-style-span" face="verdana, sans-serif">that shows how this can be done, so I can use it for later</font></div>

<div><font class="Apple-style-span" face="verdana, sans-serif">references.</font></div><div><font class="Apple-style-span" face="verdana, sans-serif"><br></font></div><div><font class="Apple-style-span" face="verdana, sans-serif">I will be busy with other things for the next two weeks but</font></div>

<div><font class="Apple-style-span" face="verdana, sans-serif">I&#39;m gonna come back to this afterwards.</font></div><div><font class="Apple-style-span" face="verdana, sans-serif"><br></font></div><div><font class="Apple-style-span" face="verdana, sans-serif">I&#39;ll see how far I can get and I will write back as soon as I run</font></div>

<div><font class="Apple-style-span" face="verdana, sans-serif">into problems I can&#39;t solve by myself.</font></div><div><font class="Apple-style-span" face="verdana, sans-serif"><br></font></div><div><font class="Apple-style-span" face="verdana, sans-serif">It would defnitely be helpful to see some examples from your</font></div>

<div><font class="Apple-style-span" face="verdana, sans-serif">code, though.</font></div><div><font class="Apple-style-span" face="verdana, sans-serif"><br></font></div><div><font class="Apple-style-span" face="verdana, sans-serif">Steffen</font></div>

<div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div><div class="gmail_quote">On Mon, Aug 1, 2011 at 19:04, Max Lehn <span dir="ltr">&lt;<a href="mailto:mlehn@dvs.tu-darmstadt.de">mlehn@dvs.tu-darmstadt.de</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi,<br>
<br>
I am working with Christof on the BubbleStorm project. I&#39;ll try to<br>
sketch the way we make our SML-to-Java bindings.<br>
<br>
The bindings basically consist of three &#39;layers&#39; of (wrapper) code:<br>
1. SML wrapper code exporting the SML API code via FFI. The code is<br>
compiled to a dynamic library (&quot;mlton -export-header &lt;header&gt;.h -format<br>
library ...&quot;).<br>
2. C code using the exported SML functions and implementing the native<br>
part for JNI. The C code is compiled to a second dynamic (JNI) library<br>
(depending on the first; I am not sure if the two libraries could be<br>
merged).<br>
3. Java code importing the native functions and wrapping them into<br>
nice-to-use Java classes. The Java application imports the two dynamic<br>
libraries.<br>
<br>
&#39;Objects&#39; between SML and Java: Java programmers expect a nice<br>
object-oriented API. Although SML is not OOP, an interface using<br>
structures in an &#39;class-like&#39; fashion allows for a quite good mapping to<br>
Java classes. (Following our convention, a &#39;class&#39; in SML is a structure<br>
with a type t and functions with an instance of type t as the first<br>
parameter (i.e, a &#39;method&#39;).) Since we cannot move objects between SML<br>
and Java, all SML &#39;object instances&#39; are passed via handles. For this,<br>
we define one handle-to-object map per &#39;class&#39; in the SML wrapper part.<br>
(The map is actually a custom implementation based on an array for<br>
efficient access.) When calling a method of an object or passing an<br>
object as a method parameter, we always use its handle.<br>
<br>
The second big thing to solve is the thread synchronization for Java.<br>
All typical Java applications use threading, so we have to translate<br>
between our single-threaded, event-based programming model in SML to<br>
Java. (We have active networking code in SML; if your SML parts are just<br>
passive, it may be somewhat easier. The very basic thing, is to prevent<br>
calls to SML from multiple threads at the same time.). Therefore, we<br>
start our SML event loop in a separate thread. Whenever an SML function<br>
is called from Java, the call information is stored in a queue, the SML<br>
part is notified to pull the data and call the function, and the results<br>
are in turn passed back through a queue. A similarly complex<br>
synchronization is necessary for callback functions implemented in Java<br>
and called from SML.<br>
This sounds rather expensive, and probably is. So I wouldn&#39;t recommend<br>
it for high performance applications. But we&#39;ve used the concept already<br>
for some applications which are more than proof-of-concept implementations.<br>
<br>
One big drawback of our current solution is the need for a lot of<br>
hand-written wrapper code. So it&#39;s really annoying (and also<br>
error-prone) to port complex interfaces. We discussed automatic code<br>
generation, but from my experience there are too many special cases to<br>
make auto-generation really useful.<br>
Furthermore, error handling is sometimes nasty. We built an exception<br>
passing mechanism which throws Java exceptions instead of crashing the<br>
VM on unhandled SML exceptions. But a Java-C-SML stack trace is hardly<br>
readable.<br>
And there are several other tiny things to solve, but so far we have<br>
been able to do (almost) everything we needed.<br>
<br>
To conclude, it works, but it is messy in some places. This was the<br>
high-level overview and a disclaimer; if you&#39;re still interested, I can<br>
try to provide you the relevant extracts and example code from our project.<br>
<br>
Max<br>
<div><div></div><div class="h5"><br>
<br>
Matthew Fluet wrote:<br>
&gt; On Fri, Jul 29, 2011 at 3:57 PM, Steffen J. Smolka<br>
&gt; &lt;<a href="mailto:steffen.smolka@in.tum.de">steffen.smolka@in.tum.de</a>&gt; wrote:<br>
&gt;&gt; Hi,<br>
&gt;&gt; I have been wondering for a while now if there&#39;s a good way to make ML code<br>
&gt;&gt; and Java code work together.<br>
&gt;&gt; What I would love to do is write a program in ML and wrap it with a GUI<br>
&gt;&gt; written in Java/Scala.<br>
&gt;&gt; What I have found so far is that it&#39;s possible to make Java work with C<br>
&gt;&gt; (JNI/JNA) and C work with ML (with MLton&#39;s Foreign Function Interface).<br>
&gt;&gt; Combining this, I would hope to get Java working with ML (via an interface<br>
&gt;&gt; written in C).<br>
&gt;&gt; However, it seems that JNI/JNA only works with dynamic libraries, that is<br>
&gt;&gt; dlls in Windows.<br>
&gt;&gt; The problem is that i can&#39;t get MLton to compile my ML/C program to a<br>
&gt;&gt; dll. Compiling the program to an executable works just fine.<br>
&gt;&gt; Is it just not possible to compile ML programs to dlls with MLton or am I<br>
&gt;&gt; doing something wrong?<br>
&gt;&gt; Or is there possibly a better way to make ML code and Java code work<br>
&gt;&gt; together?<br>
&gt;&gt; I know it&#39;s possible to compile the ML programm to a standalone executable<br>
&gt;&gt; and simply call that executable from within Java.<br>
&gt;&gt; The problem is that this would limit data transfer beetween the programs to<br>
&gt;&gt; strings which might require lots of encoding and decoding and doesn&#39;t seem<br>
&gt;&gt; like a good solution.<br>
&gt; You could certainly send binary data back and forth to the SML program<br>
&gt; (rather than just text data).  That still requires some amount of<br>
&gt; serialization of complex data.  But, unless you are simply passing<br>
&gt; flat arrays of 32-bit integers (or something similar), you would still<br>
&gt; need some amount of serialization, since Java doesn&#39;t know MLton&#39;s<br>
&gt; native object format and MLton doesn&#39;t know Java&#39;s native object<br>
&gt; format.<br>
&gt;<br>
&gt; As for compiling to a DLL, there is some support for compiling a SML<br>
&gt; program to a library.  See &quot;<a href="http://mlton.org/LibrarySupport" target="_blank">http://mlton.org/LibrarySupport</a>&quot;; I&#39;m not<br>
&gt; sure that it supports compiling to a DLL, since there isn&#39;t a native<br>
&gt; Windows port of MLton; on Windows, we use either Cygwin or MinGW.<br>
&gt;<br>
</div></div><div class="im">&gt; _______________________________________________<br>
&gt; MLton-user mailing list<br>
&gt; <a href="mailto:MLton-user@mlton.org">MLton-user@mlton.org</a><br>
&gt; <a href="http://mlton.org/mailman/listinfo/mlton-user" target="_blank">http://mlton.org/mailman/listinfo/mlton-user</a><br>
<br>
<br>
</div><font color="#888888">--<br>
Max Lehn<br>
Databases and Distributed Systems<br>
Technische Universität Darmstadt<br>
Hochschulstr. 10, 64289 Darmstadt, Germany<br>
Tel.: <a href="tel:%2B49%206151%20167425" value="+496151167425">+49 6151 167425</a><br>
<a href="http://www.dvs.tu-darmstadt.de/" target="_blank">http://www.dvs.tu-darmstadt.de/</a><br>
</font><div><div></div><div class="h5"><br>
<br>
_______________________________________________<br>
MLton-user mailing list<br>
<a href="mailto:MLton-user@mlton.org">MLton-user@mlton.org</a><br>
<a href="http://mlton.org/mailman/listinfo/mlton-user" target="_blank">http://mlton.org/mailman/listinfo/mlton-user</a><br>
</div></div></blockquote></div><br></div>