363 lines
13 KiB
Factor
363 lines
13 KiB
Factor
|
|
! Copyright (C) 2006 Chris Double.
|
||
|
|
! See http://factorcode.org/license.txt for BSD license.
|
||
|
|
IN: jni-internals
|
||
|
|
USING: kernel alien arrays sequences ;
|
||
|
|
|
||
|
|
LIBRARY: jvm
|
||
|
|
|
||
|
|
TYPEDEF: int jint
|
||
|
|
TYPEDEF: uchar jboolean
|
||
|
|
TYPEDEF: void* JNIEnv
|
||
|
|
|
||
|
|
BEGIN-STRUCT: jdk-init-args
|
||
|
|
FIELD: jint version
|
||
|
|
FIELD: void* properties
|
||
|
|
FIELD: jint check-source
|
||
|
|
FIELD: jint native-stack-size
|
||
|
|
FIELD: jint java-stack-size
|
||
|
|
FIELD: jint min-heap-size
|
||
|
|
FIELD: jint max-heap-size
|
||
|
|
FIELD: jint verify-mode
|
||
|
|
FIELD: char* classpath
|
||
|
|
FIELD: void* vprintf
|
||
|
|
FIELD: void* exit
|
||
|
|
FIELD: void* abort
|
||
|
|
FIELD: jint enable-class-gc
|
||
|
|
FIELD: jint enable-verbose-gc
|
||
|
|
FIELD: jint disable-async-gc
|
||
|
|
FIELD: jint verbose
|
||
|
|
FIELD: jboolean debugging
|
||
|
|
FIELD: jint debug-port
|
||
|
|
END-STRUCT
|
||
|
|
|
||
|
|
BEGIN-STRUCT: JNIInvokeInterface
|
||
|
|
FIELD: void* reserved0
|
||
|
|
FIELD: void* reserved1
|
||
|
|
FIELD: void* reserved2
|
||
|
|
FIELD: void* DestroyJavaVM
|
||
|
|
FIELD: void* AttachCurrentThread
|
||
|
|
FIELD: void* DetachCurrentThread
|
||
|
|
FIELD: void* GetEnv
|
||
|
|
FIELD: void* AttachCurrentThreadAsDaemon
|
||
|
|
END-STRUCT
|
||
|
|
|
||
|
|
BEGIN-STRUCT: JavaVM
|
||
|
|
FIELD: JNIInvokeInterface* functions
|
||
|
|
END-STRUCT
|
||
|
|
|
||
|
|
BEGIN-STRUCT: JNINativeInterface
|
||
|
|
FIELD: void* reserved0
|
||
|
|
FIELD: void* reserved1
|
||
|
|
FIELD: void* reserved2
|
||
|
|
FIELD: void* reserved3
|
||
|
|
FIELD: void* GetVersion
|
||
|
|
FIELD: void* DefineClass
|
||
|
|
FIELD: void* FindClass
|
||
|
|
FIELD: void* FromReflectedMethod
|
||
|
|
FIELD: void* FromReflectedField
|
||
|
|
FIELD: void* ToReflectedMethod
|
||
|
|
FIELD: void* GetSuperclass
|
||
|
|
FIELD: void* IsAssignableFrom
|
||
|
|
FIELD: void* ToReflectedField
|
||
|
|
FIELD: void* Throw
|
||
|
|
FIELD: void* ThrowNew
|
||
|
|
FIELD: void* ExceptionOccurred
|
||
|
|
FIELD: void* ExceptionDescribe
|
||
|
|
FIELD: void* ExceptionClear
|
||
|
|
FIELD: void* FatalError
|
||
|
|
FIELD: void* PushLocalFrame
|
||
|
|
FIELD: void* PopLocalFrame
|
||
|
|
FIELD: void* NewGlobalRef
|
||
|
|
FIELD: void* DeleteGlobalRef
|
||
|
|
FIELD: void* DeleteLocalRef
|
||
|
|
FIELD: void* IsSameObject
|
||
|
|
FIELD: void* NewLocalRef
|
||
|
|
FIELD: void* EnsureLocalCapacity
|
||
|
|
FIELD: void* AllocObject
|
||
|
|
FIELD: void* NewObject
|
||
|
|
FIELD: void* NewObjectV
|
||
|
|
FIELD: void* NewObjectA
|
||
|
|
FIELD: void* GetObjectClass
|
||
|
|
FIELD: void* IsInstanceOf
|
||
|
|
FIELD: void* GetMethodID
|
||
|
|
FIELD: void* CallObjectMethod
|
||
|
|
FIELD: void* CallObjectMethodV
|
||
|
|
FIELD: void* CallObjectMethodA
|
||
|
|
FIELD: void* CallBooleanMethod
|
||
|
|
FIELD: void* CallBooleanMethodV
|
||
|
|
FIELD: void* CallBooleanMethodA
|
||
|
|
FIELD: void* CallByteMethod
|
||
|
|
FIELD: void* CallByteMethodV
|
||
|
|
FIELD: void* CallByteMethodA
|
||
|
|
FIELD: void* CallCharMethod
|
||
|
|
FIELD: void* CallCharMethodV
|
||
|
|
FIELD: void* CallCharMethodA
|
||
|
|
FIELD: void* CallShortMethod
|
||
|
|
FIELD: void* CallShortMethodV
|
||
|
|
FIELD: void* CallShortMethodA
|
||
|
|
FIELD: void* CallIntMethod
|
||
|
|
FIELD: void* CallIntMethodV
|
||
|
|
FIELD: void* CallIntMethodA
|
||
|
|
FIELD: void* CallLongMethod
|
||
|
|
FIELD: void* CallLongMethodV
|
||
|
|
FIELD: void* CallLongMethodA
|
||
|
|
FIELD: void* CallFloatMethod
|
||
|
|
FIELD: void* CallFloatMethodV
|
||
|
|
FIELD: void* CallFloatMethodA
|
||
|
|
FIELD: void* CallDoubleMethod
|
||
|
|
FIELD: void* CallDoubleMethodV
|
||
|
|
FIELD: void* CallDoubleMethodA
|
||
|
|
FIELD: void* CallVoidMethod
|
||
|
|
FIELD: void* CallVoidMethodV
|
||
|
|
FIELD: void* CallVoidMethodA
|
||
|
|
FIELD: void* CallNonvirtualObjectMethod
|
||
|
|
FIELD: void* CallNonvirtualObjectMethodV
|
||
|
|
FIELD: void* CallNonvirtualObjectMethodA
|
||
|
|
FIELD: void* CallNonvirtualBooleanMethod
|
||
|
|
FIELD: void* CallNonvirtualBooleanMethodV
|
||
|
|
FIELD: void* CallNonvirtualBooleanMethodA
|
||
|
|
FIELD: void* CallNonvirtualByteMethod
|
||
|
|
FIELD: void* CallNonvirtualByteMethodV
|
||
|
|
FIELD: void* CallNonvirtualByteMethodA
|
||
|
|
FIELD: void* CallNonvirtualCharMethod
|
||
|
|
FIELD: void* CallNonvirtualCharMethodV
|
||
|
|
FIELD: void* CallNonvirtualCharMethodA
|
||
|
|
FIELD: void* CallNonvirtualShortMethod
|
||
|
|
FIELD: void* CallNonvirtualShortMethodV
|
||
|
|
FIELD: void* CallNonvirtualShortMethodA
|
||
|
|
FIELD: void* CallNonvirtualIntMethod
|
||
|
|
FIELD: void* CallNonvirtualIntMethodV
|
||
|
|
FIELD: void* CallNonvirtualIntMethodA
|
||
|
|
FIELD: void* CallNonvirtualLongMethod
|
||
|
|
FIELD: void* CallNonvirtualLongMethodV
|
||
|
|
FIELD: void* CallNonvirtualLongMethodA
|
||
|
|
FIELD: void* CallNonvirtualFloatMethod
|
||
|
|
FIELD: void* CallNonvirtualFloatMethodV
|
||
|
|
FIELD: void* CallNonvirtualFloatMethodA
|
||
|
|
FIELD: void* CallNonvirtualDoubleMethod
|
||
|
|
FIELD: void* CallNonvirtualDoubleMethodV
|
||
|
|
FIELD: void* CallNonvirtualDoubleMethodA
|
||
|
|
FIELD: void* CallNonvirtualVoidMethod
|
||
|
|
FIELD: void* CallNonvirtualVoidMethodV
|
||
|
|
FIELD: void* CallNonvirtualVoidMethodA
|
||
|
|
FIELD: void* GetFieldID
|
||
|
|
FIELD: void* GetObjectField
|
||
|
|
FIELD: void* GetBooleanField
|
||
|
|
FIELD: void* GetByteField
|
||
|
|
FIELD: void* GetCharField
|
||
|
|
FIELD: void* GetShortField
|
||
|
|
FIELD: void* GetIntField
|
||
|
|
FIELD: void* GetLongField
|
||
|
|
FIELD: void* GetFloatField
|
||
|
|
FIELD: void* GetDoubleField
|
||
|
|
FIELD: void* SetObjectField
|
||
|
|
FIELD: void* SetBooleanField
|
||
|
|
FIELD: void* SetByteField
|
||
|
|
FIELD: void* SetCharField
|
||
|
|
FIELD: void* SetShortField
|
||
|
|
FIELD: void* SetIntField
|
||
|
|
FIELD: void* SetLongField
|
||
|
|
FIELD: void* SetFloatField
|
||
|
|
FIELD: void* SetDoubleField
|
||
|
|
FIELD: void* GetStaticMethodID
|
||
|
|
FIELD: void* CallStaticObjectMethod
|
||
|
|
FIELD: void* CallStaticObjectMethodV
|
||
|
|
FIELD: void* CallStaticObjectMethodA
|
||
|
|
FIELD: void* CallStaticBooleanMethod
|
||
|
|
FIELD: void* CallStaticBooleanMethodV
|
||
|
|
FIELD: void* CallStaticBooleanMethodA
|
||
|
|
FIELD: void* CallStaticByteMethod
|
||
|
|
FIELD: void* CallStaticByteMethodV
|
||
|
|
FIELD: void* CallStaticByteMethodA
|
||
|
|
FIELD: void* CallStaticCharMethod
|
||
|
|
FIELD: void* CallStaticCharMethodV
|
||
|
|
FIELD: void* CallStaticCharMethodA
|
||
|
|
FIELD: void* CallStaticShortMethod
|
||
|
|
FIELD: void* CallStaticShortMethodV
|
||
|
|
FIELD: void* CallStaticShortMethodA
|
||
|
|
FIELD: void* CallStaticIntMethod
|
||
|
|
FIELD: void* CallStaticIntMethodV
|
||
|
|
FIELD: void* CallStaticIntMethodA
|
||
|
|
FIELD: void* CallStaticLongMethod
|
||
|
|
FIELD: void* CallStaticLongMethodV
|
||
|
|
FIELD: void* CallStaticLongMethodA
|
||
|
|
FIELD: void* CallStaticFloatMethod
|
||
|
|
FIELD: void* CallStaticFloatMethodV
|
||
|
|
FIELD: void* CallStaticFloatMethodA
|
||
|
|
FIELD: void* CallStaticDoubleMethod
|
||
|
|
FIELD: void* CallStaticDoubleMethodV
|
||
|
|
FIELD: void* CallStaticDoubleMethodA
|
||
|
|
FIELD: void* CallStaticVoidMethod
|
||
|
|
FIELD: void* CallStaticVoidMethodV
|
||
|
|
FIELD: void* CallStaticVoidMethodA
|
||
|
|
FIELD: void* GetStaticFieldID
|
||
|
|
FIELD: void* GetStaticObjectField
|
||
|
|
FIELD: void* GetStaticBooleanField
|
||
|
|
FIELD: void* GetStaticByteField
|
||
|
|
FIELD: void* GetStaticCharField
|
||
|
|
FIELD: void* GetStaticShortField
|
||
|
|
FIELD: void* GetStaticIntField
|
||
|
|
FIELD: void* GetStaticLongField
|
||
|
|
FIELD: void* GetStaticFloatField
|
||
|
|
FIELD: void* GetStaticDoubleField
|
||
|
|
FIELD: void* SetStaticObjectField
|
||
|
|
FIELD: void* SetStaticBooleanField
|
||
|
|
FIELD: void* SetStaticByteField
|
||
|
|
FIELD: void* SetStaticCharField
|
||
|
|
FIELD: void* SetStaticShortField
|
||
|
|
FIELD: void* SetStaticIntField
|
||
|
|
FIELD: void* SetStaticLongField
|
||
|
|
FIELD: void* SetStaticFloatField
|
||
|
|
FIELD: void* SetStaticDoubleField
|
||
|
|
FIELD: void* NewString
|
||
|
|
FIELD: void* GetStringLength
|
||
|
|
FIELD: void* GetStringChars
|
||
|
|
FIELD: void* ReleaseStringChars
|
||
|
|
FIELD: void* NewStringUTF
|
||
|
|
FIELD: void* GetStringUTFLength
|
||
|
|
FIELD: void* GetStringUTFChars
|
||
|
|
FIELD: void* ReleaseStringUTFChars
|
||
|
|
FIELD: void* GetArrayLength
|
||
|
|
FIELD: void* NewObjectArray
|
||
|
|
FIELD: void* GetObjectArrayElement
|
||
|
|
FIELD: void* SetObjectArrayElement
|
||
|
|
FIELD: void* NewBooleanArray
|
||
|
|
FIELD: void* NewByteArray
|
||
|
|
FIELD: void* NewCharArray
|
||
|
|
FIELD: void* NewShortArray
|
||
|
|
FIELD: void* NewIntArray
|
||
|
|
FIELD: void* NewLongArray
|
||
|
|
FIELD: void* NewFloatArray
|
||
|
|
FIELD: void* NewDoubleArray
|
||
|
|
FIELD: void* GetBooleanArrayElements
|
||
|
|
FIELD: void* GetByteArrayElements
|
||
|
|
FIELD: void* GetCharArrayElements
|
||
|
|
FIELD: void* GetShortArrayElements
|
||
|
|
FIELD: void* GetIntArrayElements
|
||
|
|
FIELD: void* GetLongArrayElements
|
||
|
|
FIELD: void* GetFloatArrayElements
|
||
|
|
FIELD: void* GetDoubleArrayElements
|
||
|
|
FIELD: void* ReleaseBooleanArrayElements
|
||
|
|
FIELD: void* ReleaseByteArrayElements
|
||
|
|
FIELD: void* ReleaseCharArrayElements
|
||
|
|
FIELD: void* ReleaseShortArrayElements
|
||
|
|
FIELD: void* ReleaseIntArrayElements
|
||
|
|
FIELD: void* ReleaseLongArrayElements
|
||
|
|
FIELD: void* ReleaseFloatArrayElements
|
||
|
|
FIELD: void* ReleaseDoubleArrayElements
|
||
|
|
FIELD: void* GetBooleanArrayRegion
|
||
|
|
FIELD: void* GetByteArrayRegion
|
||
|
|
FIELD: void* GetCharArrayRegion
|
||
|
|
FIELD: void* GetShortArrayRegion
|
||
|
|
FIELD: void* GetIntArrayRegion
|
||
|
|
FIELD: void* GetLongArrayRegion
|
||
|
|
FIELD: void* GetFloatArrayRegion
|
||
|
|
FIELD: void* GetDoubleArrayRegion
|
||
|
|
FIELD: void* SetBooleanArrayRegion
|
||
|
|
FIELD: void* SetByteArrayRegion
|
||
|
|
FIELD: void* SetCharArrayRegion
|
||
|
|
FIELD: void* SetShortArrayRegion
|
||
|
|
FIELD: void* SetIntArrayRegion
|
||
|
|
FIELD: void* SetLongArrayRegion
|
||
|
|
FIELD: void* SetFloatArrayRegion
|
||
|
|
FIELD: void* SetDoubleArrayRegion
|
||
|
|
FIELD: void* RegisterNatives
|
||
|
|
FIELD: void* UnregisterNatives
|
||
|
|
FIELD: void* MonitorEnter
|
||
|
|
FIELD: void* MonitorExit
|
||
|
|
FIELD: void* GetJavaVM
|
||
|
|
FIELD: void* GetStringRegion
|
||
|
|
FIELD: void* GetStringUTFRegion
|
||
|
|
FIELD: void* GetPrimitiveArrayCritical
|
||
|
|
FIELD: void* ReleasePrimitiveArrayCritical
|
||
|
|
FIELD: void* GetStringCritical
|
||
|
|
FIELD: void* ReleaseStringCritical
|
||
|
|
FIELD: void* NewWeakGlobalRef
|
||
|
|
FIELD: void* DeleteWeakGlobalRef
|
||
|
|
FIELD: void* ExceptionCheck
|
||
|
|
FIELD: void* NewDirectByteBuffer
|
||
|
|
FIELD: void* GetDirectBufferAddress
|
||
|
|
FIELD: void* GetDirectBufferCapacity
|
||
|
|
END-STRUCT
|
||
|
|
|
||
|
|
BEGIN-STRUCT: JNIEnv
|
||
|
|
FIELD: JNINativeInterface* functions
|
||
|
|
END-STRUCT
|
||
|
|
|
||
|
|
FUNCTION: jint JNI_GetDefaultJavaVMInitArgs ( jdk-init-args* args ) ;
|
||
|
|
FUNCTION: jint JNI_CreateJavaVM ( void** pvm, void** penv, void* args ) ;
|
||
|
|
|
||
|
|
: <jdk-init-args> ( -- jdk-init-args )
|
||
|
|
"jdk-init-args" <c-object> HEX: 00010004 over set-jdk-init-args-version ;
|
||
|
|
|
||
|
|
: jni1 ( -- init-args int )
|
||
|
|
<jdk-init-args> dup JNI_GetDefaultJavaVMInitArgs ;
|
||
|
|
|
||
|
|
: jni2 ( -- vm env int )
|
||
|
|
f <void*> f <void*> [
|
||
|
|
jni1 drop JNI_CreateJavaVM
|
||
|
|
] 2keep rot dup 0 = [
|
||
|
|
>r >r 0 swap void*-nth r> 0 swap void*-nth r>
|
||
|
|
] when ;
|
||
|
|
|
||
|
|
: (destroy-java-vm)
|
||
|
|
"int" { "void*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: (attach-current-thread)
|
||
|
|
"int" { "void*" "void*" "void*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: (detach-current-thread)
|
||
|
|
"int" { "void*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: (get-env)
|
||
|
|
"int" { "void*" "void*" "int" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: (attach-current-thread-as-daemon)
|
||
|
|
"int" { "void*" "void*" "void*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: destroy-java-vm ( javavm -- int )
|
||
|
|
dup JavaVM-functions JNIInvokeInterface-DestroyJavaVM (destroy-java-vm) ;
|
||
|
|
|
||
|
|
: (get-version)
|
||
|
|
"jint" { "JNIEnv*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: get-version ( jnienv -- int )
|
||
|
|
dup JNIEnv-functions JNINativeInterface-GetVersion (get-version) ;
|
||
|
|
|
||
|
|
: (find-class)
|
||
|
|
"void*" { "JNINativeInterface*" "char*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: find-class ( name jnienv -- int )
|
||
|
|
dup swapd JNIEnv-functions JNINativeInterface-FindClass (find-class) ;
|
||
|
|
|
||
|
|
: (get-static-field-id)
|
||
|
|
"void*" { "JNINativeInterface*" "void*" "char*" "char*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: get-static-field-id ( class name sig jnienv -- int )
|
||
|
|
dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-GetStaticFieldID (get-static-field-id) ;
|
||
|
|
|
||
|
|
: (get-static-object-field)
|
||
|
|
"void*" { "JNINativeInterface*" "void*" "void*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: get-static-object-field ( class id jnienv -- int )
|
||
|
|
dup >r >r 2array r> swap first2 r> JNIEnv-functions JNINativeInterface-GetStaticObjectField (get-static-object-field) ;
|
||
|
|
|
||
|
|
: (get-method-id)
|
||
|
|
"void*" { "JNINativeInterface*" "void*" "char*" "char*" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: get-method-id ( class name sig jnienv -- int )
|
||
|
|
dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-GetMethodID (get-method-id) ;
|
||
|
|
|
||
|
|
: (new-string)
|
||
|
|
"void*" { "JNINativeInterface*" "char*" "int" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: new-string ( str jnienv -- str )
|
||
|
|
dup >r >r dup length 2array r> swap first2 r> JNIEnv-functions JNINativeInterface-NewString (new-string) ;
|
||
|
|
|
||
|
|
: (call1)
|
||
|
|
"void" { "JNINativeInterface*" "void*" "void*" "int" } "cdecl" alien-indirect ;
|
||
|
|
|
||
|
|
: call1 ( obj method-id jstr jnienv -- )
|
||
|
|
dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-CallObjectMethod (call1) ;
|
||
|
|
|