]> gitweb.factorcode.org Git - factor.git/blob - libs/jni/jni-internals.factor
more sql changes
[factor.git] / libs / jni / jni-internals.factor
1 ! Copyright (C) 2006 Chris Double.
2 ! See http://factorcode.org/license.txt for BSD license.
3 IN: jni-internals
4 USING: kernel alien arrays sequences ;
5
6 LIBRARY: jvm
7
8 TYPEDEF: int jint
9 TYPEDEF: uchar jboolean
10 TYPEDEF: void* JNIEnv
11
12 BEGIN-STRUCT: jdk-init-args
13         FIELD: jint version
14         FIELD: void* properties
15         FIELD: jint check-source
16         FIELD: jint native-stack-size
17         FIELD: jint java-stack-size
18         FIELD: jint min-heap-size
19         FIELD: jint max-heap-size
20         FIELD: jint verify-mode
21         FIELD: char* classpath
22         FIELD: void* vprintf
23         FIELD: void* exit
24         FIELD: void* abort
25         FIELD: jint enable-class-gc
26         FIELD: jint enable-verbose-gc
27         FIELD: jint disable-async-gc
28         FIELD: jint verbose
29         FIELD: jboolean debugging
30         FIELD: jint debug-port
31 END-STRUCT
32
33 BEGIN-STRUCT: JNIInvokeInterface
34         FIELD: void* reserved0
35         FIELD: void* reserved1
36         FIELD: void* reserved2
37         FIELD: void* DestroyJavaVM
38         FIELD: void* AttachCurrentThread
39         FIELD: void* DetachCurrentThread
40         FIELD: void* GetEnv
41         FIELD: void* AttachCurrentThreadAsDaemon
42 END-STRUCT
43
44 BEGIN-STRUCT: JavaVM
45         FIELD: JNIInvokeInterface* functions
46 END-STRUCT
47
48 BEGIN-STRUCT: JNINativeInterface
49         FIELD: void* reserved0
50         FIELD: void* reserved1
51         FIELD: void* reserved2
52         FIELD: void* reserved3
53         FIELD: void* GetVersion
54         FIELD: void* DefineClass
55         FIELD: void* FindClass
56         FIELD: void* FromReflectedMethod
57         FIELD: void* FromReflectedField
58         FIELD: void* ToReflectedMethod
59         FIELD: void* GetSuperclass
60         FIELD: void* IsAssignableFrom
61         FIELD: void* ToReflectedField
62         FIELD: void* Throw
63         FIELD: void* ThrowNew
64         FIELD: void* ExceptionOccurred
65         FIELD: void* ExceptionDescribe
66         FIELD: void* ExceptionClear
67         FIELD: void* FatalError
68         FIELD: void* PushLocalFrame
69         FIELD: void* PopLocalFrame
70         FIELD: void* NewGlobalRef
71         FIELD: void* DeleteGlobalRef
72         FIELD: void* DeleteLocalRef
73         FIELD: void* IsSameObject
74         FIELD: void* NewLocalRef
75         FIELD: void* EnsureLocalCapacity
76         FIELD: void* AllocObject
77         FIELD: void* NewObject
78         FIELD: void* NewObjectV
79         FIELD: void* NewObjectA
80         FIELD: void* GetObjectClass
81         FIELD: void* IsInstanceOf
82         FIELD: void* GetMethodID
83         FIELD: void* CallObjectMethod
84         FIELD: void* CallObjectMethodV
85         FIELD: void* CallObjectMethodA
86         FIELD: void* CallBooleanMethod
87         FIELD: void* CallBooleanMethodV
88         FIELD: void* CallBooleanMethodA
89         FIELD: void* CallByteMethod
90         FIELD: void* CallByteMethodV
91         FIELD: void* CallByteMethodA
92         FIELD: void* CallCharMethod
93         FIELD: void* CallCharMethodV
94         FIELD: void* CallCharMethodA
95         FIELD: void* CallShortMethod
96         FIELD: void* CallShortMethodV
97         FIELD: void* CallShortMethodA
98         FIELD: void* CallIntMethod
99         FIELD: void* CallIntMethodV
100         FIELD: void* CallIntMethodA
101         FIELD: void* CallLongMethod
102         FIELD: void* CallLongMethodV
103         FIELD: void* CallLongMethodA
104         FIELD: void* CallFloatMethod
105         FIELD: void* CallFloatMethodV
106         FIELD: void* CallFloatMethodA
107         FIELD: void* CallDoubleMethod
108         FIELD: void* CallDoubleMethodV
109         FIELD: void* CallDoubleMethodA
110         FIELD: void* CallVoidMethod
111         FIELD: void* CallVoidMethodV
112         FIELD: void* CallVoidMethodA
113         FIELD: void* CallNonvirtualObjectMethod
114         FIELD: void* CallNonvirtualObjectMethodV
115         FIELD: void* CallNonvirtualObjectMethodA
116         FIELD: void* CallNonvirtualBooleanMethod
117         FIELD: void* CallNonvirtualBooleanMethodV
118         FIELD: void* CallNonvirtualBooleanMethodA
119         FIELD: void* CallNonvirtualByteMethod
120         FIELD: void* CallNonvirtualByteMethodV
121         FIELD: void* CallNonvirtualByteMethodA
122         FIELD: void* CallNonvirtualCharMethod
123         FIELD: void* CallNonvirtualCharMethodV
124         FIELD: void* CallNonvirtualCharMethodA
125         FIELD: void* CallNonvirtualShortMethod
126         FIELD: void* CallNonvirtualShortMethodV
127         FIELD: void* CallNonvirtualShortMethodA
128         FIELD: void* CallNonvirtualIntMethod
129         FIELD: void* CallNonvirtualIntMethodV
130         FIELD: void* CallNonvirtualIntMethodA
131         FIELD: void* CallNonvirtualLongMethod
132         FIELD: void* CallNonvirtualLongMethodV
133         FIELD: void* CallNonvirtualLongMethodA
134         FIELD: void* CallNonvirtualFloatMethod
135         FIELD: void* CallNonvirtualFloatMethodV
136         FIELD: void* CallNonvirtualFloatMethodA
137         FIELD: void* CallNonvirtualDoubleMethod
138         FIELD: void* CallNonvirtualDoubleMethodV
139         FIELD: void* CallNonvirtualDoubleMethodA
140         FIELD: void* CallNonvirtualVoidMethod
141         FIELD: void* CallNonvirtualVoidMethodV
142         FIELD: void* CallNonvirtualVoidMethodA
143         FIELD: void* GetFieldID
144         FIELD: void* GetObjectField
145         FIELD: void* GetBooleanField
146         FIELD: void* GetByteField
147         FIELD: void* GetCharField
148         FIELD: void* GetShortField
149         FIELD: void* GetIntField
150         FIELD: void* GetLongField
151         FIELD: void* GetFloatField
152         FIELD: void* GetDoubleField
153         FIELD: void* SetObjectField
154         FIELD: void* SetBooleanField
155         FIELD: void* SetByteField
156         FIELD: void* SetCharField
157         FIELD: void* SetShortField
158         FIELD: void* SetIntField
159         FIELD: void* SetLongField
160         FIELD: void* SetFloatField
161         FIELD: void* SetDoubleField
162         FIELD: void* GetStaticMethodID
163         FIELD: void* CallStaticObjectMethod
164         FIELD: void* CallStaticObjectMethodV
165         FIELD: void* CallStaticObjectMethodA
166         FIELD: void* CallStaticBooleanMethod
167         FIELD: void* CallStaticBooleanMethodV
168         FIELD: void* CallStaticBooleanMethodA
169         FIELD: void* CallStaticByteMethod
170         FIELD: void* CallStaticByteMethodV
171         FIELD: void* CallStaticByteMethodA
172         FIELD: void* CallStaticCharMethod
173         FIELD: void* CallStaticCharMethodV
174         FIELD: void* CallStaticCharMethodA
175         FIELD: void* CallStaticShortMethod
176         FIELD: void* CallStaticShortMethodV
177         FIELD: void* CallStaticShortMethodA
178         FIELD: void* CallStaticIntMethod
179         FIELD: void* CallStaticIntMethodV
180         FIELD: void* CallStaticIntMethodA
181         FIELD: void* CallStaticLongMethod
182         FIELD: void* CallStaticLongMethodV
183         FIELD: void* CallStaticLongMethodA
184         FIELD: void* CallStaticFloatMethod
185         FIELD: void* CallStaticFloatMethodV
186         FIELD: void* CallStaticFloatMethodA
187         FIELD: void* CallStaticDoubleMethod
188         FIELD: void* CallStaticDoubleMethodV
189         FIELD: void* CallStaticDoubleMethodA
190         FIELD: void* CallStaticVoidMethod
191         FIELD: void* CallStaticVoidMethodV
192         FIELD: void* CallStaticVoidMethodA
193         FIELD: void* GetStaticFieldID
194         FIELD: void* GetStaticObjectField
195         FIELD: void* GetStaticBooleanField
196         FIELD: void* GetStaticByteField
197         FIELD: void* GetStaticCharField
198         FIELD: void* GetStaticShortField
199         FIELD: void* GetStaticIntField
200         FIELD: void* GetStaticLongField
201         FIELD: void* GetStaticFloatField
202         FIELD: void* GetStaticDoubleField
203         FIELD: void* SetStaticObjectField
204         FIELD: void* SetStaticBooleanField
205         FIELD: void* SetStaticByteField
206         FIELD: void* SetStaticCharField
207         FIELD: void* SetStaticShortField
208         FIELD: void* SetStaticIntField
209         FIELD: void* SetStaticLongField
210         FIELD: void* SetStaticFloatField
211         FIELD: void* SetStaticDoubleField
212         FIELD: void* NewString
213         FIELD: void* GetStringLength
214         FIELD: void* GetStringChars
215         FIELD: void* ReleaseStringChars
216         FIELD: void* NewStringUTF
217         FIELD: void* GetStringUTFLength
218         FIELD: void* GetStringUTFChars
219         FIELD: void* ReleaseStringUTFChars
220         FIELD: void* GetArrayLength
221         FIELD: void* NewObjectArray
222         FIELD: void* GetObjectArrayElement
223         FIELD: void* SetObjectArrayElement
224         FIELD: void* NewBooleanArray
225         FIELD: void* NewByteArray
226         FIELD: void* NewCharArray
227         FIELD: void* NewShortArray
228         FIELD: void* NewIntArray
229         FIELD: void* NewLongArray
230         FIELD: void* NewFloatArray
231         FIELD: void* NewDoubleArray
232         FIELD: void* GetBooleanArrayElements
233         FIELD: void* GetByteArrayElements
234         FIELD: void* GetCharArrayElements
235         FIELD: void* GetShortArrayElements
236         FIELD: void* GetIntArrayElements
237         FIELD: void* GetLongArrayElements
238         FIELD: void* GetFloatArrayElements
239         FIELD: void* GetDoubleArrayElements
240         FIELD: void* ReleaseBooleanArrayElements
241         FIELD: void* ReleaseByteArrayElements
242         FIELD: void* ReleaseCharArrayElements
243         FIELD: void* ReleaseShortArrayElements
244         FIELD: void* ReleaseIntArrayElements
245         FIELD: void* ReleaseLongArrayElements
246         FIELD: void* ReleaseFloatArrayElements
247         FIELD: void* ReleaseDoubleArrayElements
248         FIELD: void* GetBooleanArrayRegion
249         FIELD: void* GetByteArrayRegion
250         FIELD: void* GetCharArrayRegion
251         FIELD: void* GetShortArrayRegion
252         FIELD: void* GetIntArrayRegion
253         FIELD: void* GetLongArrayRegion
254         FIELD: void* GetFloatArrayRegion
255         FIELD: void* GetDoubleArrayRegion
256         FIELD: void* SetBooleanArrayRegion
257         FIELD: void* SetByteArrayRegion
258         FIELD: void* SetCharArrayRegion
259         FIELD: void* SetShortArrayRegion
260         FIELD: void* SetIntArrayRegion
261         FIELD: void* SetLongArrayRegion
262         FIELD: void* SetFloatArrayRegion
263         FIELD: void* SetDoubleArrayRegion
264         FIELD: void* RegisterNatives
265         FIELD: void* UnregisterNatives
266         FIELD: void* MonitorEnter
267         FIELD: void* MonitorExit
268         FIELD: void* GetJavaVM
269         FIELD: void* GetStringRegion
270         FIELD: void* GetStringUTFRegion
271         FIELD: void* GetPrimitiveArrayCritical
272         FIELD: void* ReleasePrimitiveArrayCritical
273         FIELD: void* GetStringCritical
274         FIELD: void* ReleaseStringCritical
275         FIELD: void* NewWeakGlobalRef
276         FIELD: void* DeleteWeakGlobalRef
277         FIELD: void* ExceptionCheck
278         FIELD: void* NewDirectByteBuffer
279         FIELD: void* GetDirectBufferAddress
280         FIELD: void* GetDirectBufferCapacity
281 END-STRUCT
282
283 BEGIN-STRUCT: JNIEnv
284         FIELD: JNINativeInterface* functions
285 END-STRUCT
286
287 FUNCTION: jint JNI_GetDefaultJavaVMInitArgs ( jdk-init-args* args ) ;
288 FUNCTION: jint JNI_CreateJavaVM ( void** pvm, void** penv, void* args ) ;
289
290 : <jdk-init-args> ( -- jdk-init-args )
291   "jdk-init-args" <c-object>  HEX: 00010004 over set-jdk-init-args-version ;
292
293 : jni1 ( -- init-args int )
294   <jdk-init-args> dup JNI_GetDefaultJavaVMInitArgs ;
295
296 : jni2 ( -- vm env int )
297   f <void*> f <void*> [
298     jni1 drop JNI_CreateJavaVM
299   ] 2keep rot dup 0 = [
300     >r >r 0 swap void*-nth r> 0 swap void*-nth r> 
301   ] when ;
302
303 : (destroy-java-vm) 
304   "int" { "void*" } "cdecl" alien-indirect ;
305
306 : (attach-current-thread) 
307   "int" { "void*" "void*" "void*" } "cdecl" alien-indirect ;
308
309 : (detach-current-thread) 
310   "int" { "void*" } "cdecl" alien-indirect ;
311
312 : (get-env) 
313   "int" { "void*" "void*" "int" } "cdecl" alien-indirect ;
314
315 : (attach-current-thread-as-daemon) 
316   "int" { "void*" "void*" "void*" } "cdecl" alien-indirect ;
317
318 : destroy-java-vm ( javavm -- int )
319   dup JavaVM-functions JNIInvokeInterface-DestroyJavaVM (destroy-java-vm) ;
320
321 : (get-version) 
322   "jint" { "JNIEnv*" } "cdecl" alien-indirect ;
323
324 : get-version ( jnienv -- int )
325   dup JNIEnv-functions JNINativeInterface-GetVersion (get-version) ;
326   
327 : (find-class) 
328   "void*" { "JNINativeInterface*" "char*" } "cdecl" alien-indirect ;
329
330 : find-class ( name jnienv -- int )
331   dup swapd JNIEnv-functions JNINativeInterface-FindClass (find-class) ;
332
333 : (get-static-field-id) 
334   "void*" { "JNINativeInterface*" "void*" "char*" "char*" } "cdecl" alien-indirect ;
335
336 : get-static-field-id ( class name sig jnienv -- int )
337   dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-GetStaticFieldID (get-static-field-id) ;
338
339 : (get-static-object-field) 
340   "void*" { "JNINativeInterface*" "void*" "void*" } "cdecl" alien-indirect ;
341
342 : get-static-object-field ( class id jnienv -- int )
343   dup >r >r 2array r> swap first2 r> JNIEnv-functions JNINativeInterface-GetStaticObjectField (get-static-object-field) ;
344
345 : (get-method-id) 
346   "void*" { "JNINativeInterface*" "void*" "char*" "char*" } "cdecl" alien-indirect ;
347
348 : get-method-id ( class name sig jnienv -- int )
349   dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-GetMethodID (get-method-id) ;
350
351 : (new-string) 
352   "void*" { "JNINativeInterface*" "char*" "int" } "cdecl" alien-indirect ;
353
354 : new-string ( str jnienv -- str )
355   dup >r >r dup length 2array r> swap first2 r> JNIEnv-functions JNINativeInterface-NewString (new-string) ;
356
357 : (call1) 
358   "void" { "JNINativeInterface*" "void*" "void*" "int" } "cdecl" alien-indirect ;
359
360 : call1 ( obj method-id jstr jnienv -- )
361   dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-CallObjectMethod (call1) ;
362