001 /*******************************************************************************
002 * Copyright (c) 2009 Progress Software, Inc.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *******************************************************************************/
009 package test;
010
011 import java.util.Arrays;
012
013 import org.fusesource.hawtjni.runtime.ClassFlag;
014 import org.fusesource.hawtjni.runtime.JniArg;
015 import org.fusesource.hawtjni.runtime.JniClass;
016 import org.fusesource.hawtjni.runtime.JniField;
017 import org.fusesource.hawtjni.runtime.JniMethod;
018 import org.fusesource.hawtjni.runtime.Library;
019
020 import static org.fusesource.hawtjni.runtime.ArgFlag.*;
021 import static org.fusesource.hawtjni.runtime.FieldFlag.*;
022 import static org.fusesource.hawtjni.runtime.MethodFlag.*;
023
024 /**
025 *
026 * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
027 */
028 @JniClass
029 public class Example {
030
031 private static final Library LIBRARY = new Library("hawtjni-example", Example.class);
032 static {
033 LIBRARY.load();
034 init();
035 }
036
037 public static final void main(String args[]) {
038
039 System.out.println("Checking Operating System Constants:");
040 System.out.println(" O_RDONLY: "+O_RDONLY);
041 System.out.println(" O_WRONLY: "+O_WRONLY);
042 System.out.println(" O_RDWR: "+O_RDWR);
043 System.out.println("");
044
045 System.out.println("Allocating c structures on the heap...");
046 int COUNT = 10;
047 // We track memory pointers with longs.
048 long []ptrArray = new long[COUNT];
049 long last=0;
050 for( int i=0; i < COUNT; i++ ) {
051 // Allocate heap space of the structure..
052 ptrArray[i] = malloc(foo.SIZEOF);
053
054 // Configure some data for a structure...
055 foo f = new foo();
056 f.a = i;
057 f.b = 1;
058
059 byte[] src = "hello world".getBytes();
060 System.arraycopy(src, 0, f.c, 0, src.length);
061
062 f.c5 = 0;
063 f.prev = last;
064
065 // Copy the data values into the allocated space.
066 memmove(ptrArray[i], f, foo.SIZEOF);
067
068 last = ptrArray[i];
069 }
070
071 // Display a couple of structures...
072 System.out.println("Dump of the first 2 structures:");
073 print_foo(ptrArray[0]);
074 print_foo(ptrArray[1]);
075
076 System.out.println("Passing a pointer array to a c function...");
077 long rc = foowork(ptrArray, COUNT);
078 System.out.println("Function result (expecting 55): "+rc);
079
080 System.out.println("freein up allocated memory.");
081 for( int i=0; i < COUNT; i++ ) {
082 free(ptrArray[i]);
083 }
084 }
085
086 // Example of how to load constants.
087 @JniMethod(flags={CONSTANT_INITIALIZER})
088 private static final native void init();
089
090 @JniField(flags={CONSTANT})
091 public static int O_RDONLY;
092 @JniField(flags={CONSTANT})
093 public static int O_WRONLY;
094 @JniField(flags={CONSTANT})
095 public static int O_RDWR;
096
097 @JniMethod(cast="void *")
098 public static final native long malloc(
099 @JniArg(cast="size_t") long size);
100
101 public static final native void free(
102 @JniArg(cast="void *") long ptr);
103
104
105 public static final native void memmove (
106 @JniArg(cast="void *") long dest,
107 @JniArg(cast="const void *") long src,
108 @JniArg(cast="size_t") long size);
109
110 public static final native void memmove (
111 @JniArg(cast="void *") long dest,
112 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) byte[] src,
113 @JniArg(cast="size_t") long size);
114
115 public static final native void memmove (
116 @JniArg(cast="void *") long dest,
117 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) char[] src,
118 @JniArg(cast="size_t") long size);
119
120 public static final native void memmove (
121 @JniArg(cast="void *") long dest,
122 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) short[] src,
123 @JniArg(cast="size_t") long size);
124
125 public static final native void memmove (
126 @JniArg(cast="void *") long dest,
127 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) int[] src,
128 @JniArg(cast="size_t") long size);
129
130 public static final native void memmove (
131 @JniArg(cast="void *") long dest,
132 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) long[] src,
133 @JniArg(cast="size_t") long size);
134
135 public static final native void memmove (
136 @JniArg(cast="void *") long dest,
137 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) float[] src,
138 @JniArg(cast="size_t") long size);
139
140 public static final native void memmove (
141 @JniArg(cast="void *") long dest,
142 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) double[] src,
143 @JniArg(cast="size_t") long size);
144
145
146
147 public static final native void memmove (
148 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) byte[] dest,
149 @JniArg(cast="const void *") long src,
150 @JniArg(cast="size_t") long size);
151
152 public static final native void memmove (
153 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) char[] dest,
154 @JniArg(cast="const void *") long src,
155 @JniArg(cast="size_t") long size);
156
157 public static final native void memmove (
158 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) short[] dest,
159 @JniArg(cast="const void *") long src,
160 @JniArg(cast="size_t") long size);
161
162 public static final native void memmove (
163 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) int[] dest,
164 @JniArg(cast="const void *") long src,
165 @JniArg(cast="size_t") long size);
166
167 public static final native void memmove (
168 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) long[] dest,
169 @JniArg(cast="const void *") long src,
170 @JniArg(cast="size_t") long size);
171
172 public static final native void memmove (
173 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) float[] dest,
174 @JniArg(cast="const void *") long src,
175 @JniArg(cast="size_t") long size);
176
177 public static final native void memmove (
178 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) double[] dest,
179 @JniArg(cast="const void *") long src,
180 @JniArg(cast="size_t") long size);
181
182 public static final native void memmove (
183 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) byte[] dest,
184 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) char[] src,
185 @JniArg(cast="size_t") long size);
186
187 public static final native void memmove (
188 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) int[] dest,
189 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) byte[] src,
190 @JniArg(cast="size_t") long size);
191
192 @JniMethod(cast="void *")
193 public static final native long memset (
194 @JniArg(cast="void *") long buffer,
195 int c,
196 @JniArg(cast="size_t") long num);
197
198 public static final native int strlen(
199 @JniArg(cast="char *")long s);
200
201 @JniClass(flags={ClassFlag.STRUCT})
202 static public class foo {
203
204 static {
205 LIBRARY.load();
206 init();
207 }
208
209 @JniMethod(flags={CONSTANT_INITIALIZER})
210 private static final native void init();
211
212 // public static final native int foo_sizeof ();
213
214 @JniField(flags={CONSTANT}, accessor="sizeof(struct foo)")
215 public static int SIZEOF;
216
217 public int a;
218
219 @JniField(cast="size_t")
220 public long b;
221
222 public byte c[] = new byte[20];
223
224 @JniField(accessor="c[5]")
225 public byte c5;
226
227 @JniField(cast="void *")
228 public long prev;
229
230 @Override
231 public int hashCode() {
232 final int prime = 31;
233 int result = 1;
234 result = prime * result + a;
235 result = prime * result + (int) (b ^ (b >>> 32));
236 result = prime * result + Arrays.hashCode(c);
237 result = prime * result + c5;
238 result = prime * result + (int) (prev ^ (prev >>> 32));
239 return result;
240 }
241
242 @Override
243 public boolean equals(Object obj) {
244 if (this == obj)
245 return true;
246 if (obj == null)
247 return false;
248 if (getClass() != obj.getClass())
249 return false;
250 foo other = (foo) obj;
251 if (a != other.a)
252 return false;
253 if (b != other.b)
254 return false;
255 if (!Arrays.equals(c, other.c))
256 return false;
257 if (c5 != other.c5)
258 return false;
259 if (prev != other.prev)
260 return false;
261 return true;
262 }
263
264 @Override
265 public String toString() {
266 return "foo [a=" + a + ", b=" + b + ", c=" + Arrays.toString(c) + ", c5=" + c5 + ", prev=" + prev + "]";
267 }
268
269 }
270
271 public static final native void memmove (
272 @JniArg(cast="void *") long dest,
273 @JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) foo src,
274 @JniArg(cast="size_t") long size);
275
276 public static final native void memmove (
277 @JniArg(cast="void *", flags={NO_IN, CRITICAL}) foo dest,
278 @JniArg(cast="const void *") long src,
279 @JniArg(cast="size_t") long size);
280
281 public static final native void print_foo(@JniArg(cast="struct foo *")long ptr);
282 public static final native long foowork (@JniArg(cast="struct foo **") long[] foos, int count);
283
284 @JniClass(flags={ClassFlag.STRUCT, ClassFlag.TYPEDEF})
285 static public class point {
286 static {
287 LIBRARY.load();
288 init();
289 }
290
291 @JniMethod(flags={CONSTANT_INITIALIZER})
292 private static final native void init();
293
294 @JniField(flags={CONSTANT}, accessor="sizeof(point)")
295 public static int SIZEOF;
296
297 public int x;
298 public int y;
299 }
300
301 public static final native void callmeback(@JniArg(cast="void *")long ptr);
302
303 }