Skip to content

Commit eefba1d

Browse files
committed
Added simple WinForms HelloDotNetWorld example.
1 parent 70e95b2 commit eefba1d

5 files changed

Lines changed: 115 additions & 1 deletion

File tree

libraries/Mono/Mono.jar

21.7 KB
Binary file not shown.

libraries/Mono/Mono.jnaerator

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
-library mono
2+
-root com.nativelibs4java
23
//-o "$(DIR)/Java"
34
//-o "C:\Prog\SymbioJ\src"
45
//-noComp
@@ -17,7 +18,7 @@
1718
-Dgpointer=void*
1819
-Dgfloat=float
1920
-Dgdouble=double
20-
-jar Mono.jar
21+
-jar "$(DIR)/Mono.jar"
2122

2223
"-IC:\Program Files\Mono-2.4.2.3\include\mono-1.0"
2324
"-IC:\Program Files\Mono-2.4.2.3\include\glib-2.0"
7.42 KB
Loading
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
if not exist classes mkdir classes
2+
javac -d classes -cp ../Mono.jar *.java
3+
java -cp ../Mono.jar;classes HelloDotNetWorld
4+
pause
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import java.io.File;
2+
import java.io.FileNotFoundException;
3+
import java.nio.IntBuffer;
4+
5+
import com.nativelibs4java.mono.MonoLibrary;
6+
import com.nativelibs4java.mono.MonoObject;
7+
import com.nativelibs4java.mono.MonoLibrary.MonoClass;
8+
import com.nativelibs4java.mono.MonoLibrary.MonoDomain;
9+
import com.nativelibs4java.mono.MonoLibrary.MonoImage;
10+
11+
import com.sun.jna.Memory;
12+
import com.sun.jna.Native;
13+
import com.sun.jna.ptr.PointerByReference;
14+
15+
public class HelloDotNetWorld {
16+
public static void main(String[] args) {
17+
try {
18+
String path = "C:\\Program Files\\Mono-2.4.2.3\\bin\\mono.dll";
19+
if (args.length == 1)
20+
path = args[0];
21+
helloDotNetWorld(new File(path));
22+
} catch (FileNotFoundException e) {
23+
e.printStackTrace();
24+
}
25+
}
26+
27+
private static void helloDotNetWorld(File monoDLL) throws FileNotFoundException {
28+
if (!monoDLL.exists())
29+
throw new FileNotFoundException("No such dll : " + monoDLL);
30+
monoDLL = monoDLL.getAbsoluteFile();
31+
System.setProperty("java.library.path", monoDLL.getParent());
32+
System.setProperty("library.mono", monoDLL.toString());
33+
System.load(monoDLL.toString());
34+
35+
final MonoLibrary m = MonoLibrary.INSTANCE;
36+
final MonoDomain domain = m.mono_jit_init(monoDLL.toString());
37+
if (domain == null)
38+
throw new RuntimeException("Unable to init Mono's runtime !");
39+
40+
IntBuffer loadStatus = IntBuffer.wrap(new int[1]);
41+
MonoImage winforms = m.mono_assembly_get_image(m.mono_assembly_load_with_partial_name("System.Windows.Forms", loadStatus));
42+
43+
m.mono_assemblies_init();
44+
Runtime.getRuntime().addShutdownHook(new Thread() {
45+
@Override
46+
public void run() {
47+
m.mono_jit_cleanup(domain);
48+
}
49+
});
50+
51+
MonoObject form = newInstance(m, domain, m.mono_class_from_name(winforms, "System.Windows.Forms", "Form"));
52+
setProperty(m, domain, form, "Text", "Mono + JNAerator + JNA");
53+
54+
MonoObject button = newInstance(m, domain, m.mono_class_from_name(winforms, "System.Windows.Forms", "Button"));
55+
setProperty(m, domain, button, "Text", "Hello .NET World\n(spawned from Java)");
56+
setProperty(m, domain, button, "Dock", 5 /*DockStyle.Fill*/);
57+
58+
invokeMethod(m, domain, getProperty(m, domain, form, "Controls"), "Add", button);
59+
invokeMethod(m, domain, m.mono_class_from_name(winforms, "System.Windows.Forms", "Application"), null, "Run", form);
60+
}
61+
private static MonoObject invokeMethod(MonoLibrary m, MonoDomain domain, MonoObject ob, String methodName, MonoObject... args) {
62+
return invokeMethod(m, domain, m.mono_object_get_class(ob), ob, methodName, args);
63+
}
64+
private static MonoObject invokeMethod(MonoLibrary m, MonoDomain domain, MonoClass cl, MonoObject ob, String methodName, MonoObject... args) {
65+
Memory mem = new Memory(args.length * Native.POINTER_SIZE);
66+
for (int i = 0; i < args.length; i++)
67+
mem.setPointer(i * Native.POINTER_SIZE, args[i].getPointer());
68+
69+
PointerByReference pargs = new PointerByReference();
70+
pargs.setPointer(mem.share(0));
71+
return m.mono_runtime_invoke(m.mono_class_get_method_from_name(cl, methodName, args.length), ob == null ? null : ob.getPointer(), pargs, null);
72+
}
73+
74+
private static MonoObject getProperty(MonoLibrary m, MonoDomain domain,
75+
MonoObject ob, String propertyName) {
76+
return m.mono_runtime_invoke(m.mono_property_get_get_method(m.mono_class_get_property_from_name(m.mono_object_get_class(ob), propertyName)), ob.getPointer(), null, null);
77+
78+
}
79+
80+
private static MonoObject newInstance(MonoLibrary m, MonoDomain domain,
81+
MonoClass cl) {
82+
MonoObject ob = m.mono_object_new(domain, cl);
83+
m.mono_runtime_class_init(ob.vtable);
84+
m.mono_runtime_object_init(ob);
85+
86+
return ob;
87+
}
88+
89+
static void setProperty(MonoLibrary m, MonoDomain domain, MonoObject ob, String propertyName, Object value) {
90+
MonoClass cl = m.mono_object_get_class(ob);
91+
92+
Memory mem = new Memory(Native.POINTER_SIZE), memPrims;
93+
if (value instanceof MonoObject)
94+
mem.setPointer(0, ((MonoObject)value).getPointer());
95+
else if (value instanceof String)
96+
mem.setPointer(0, m.mono_string_new(domain, (String)value).object.getPointer());
97+
else if (value instanceof Integer) {
98+
memPrims = new Memory(8);
99+
memPrims.setInt(0, (Integer)value);
100+
mem.setPointer(0, memPrims.share(0));
101+
} else
102+
throw new UnsupportedOperationException("implement me !");
103+
104+
PointerByReference pargs = new PointerByReference();
105+
pargs.setPointer(mem.share(0));
106+
m.mono_runtime_invoke(m.mono_property_get_set_method(m.mono_class_get_property_from_name(cl, propertyName)), ob.getPointer(), pargs, null);
107+
}
108+
}
109+

0 commit comments

Comments
 (0)