diff options
Diffstat (limited to 'mobile/android/modules/JNI.jsm')
-rw-r--r-- | mobile/android/modules/JNI.jsm | 1167 |
1 files changed, 0 insertions, 1167 deletions
diff --git a/mobile/android/modules/JNI.jsm b/mobile/android/modules/JNI.jsm deleted file mode 100644 index 1e10b9cfb..000000000 --- a/mobile/android/modules/JNI.jsm +++ /dev/null @@ -1,1167 +0,0 @@ -// JavaScript to Java bridge via the Java Native Interface -// Allows calling into Android SDK from JavaScript in Firefox Add-On. -// Released into the public domain. -// C. Scott Ananian <cscott@laptop.org> (http://cscott.net) - -// NOTE: All changes to this file should first be pushed to the repo at: -// https://github.com/cscott/skeleton-addon-fxandroid/tree/jni - -var EXPORTED_SYMBOLS = ["JNI","android_log"]; - -Components.utils.import("resource://gre/modules/ctypes.jsm") - -var liblog = ctypes.open('liblog.so'); -var android_log = liblog.declare("__android_log_write", - ctypes.default_abi, - ctypes.int32_t, - ctypes.int32_t, - ctypes.char.ptr, - ctypes.char.ptr); - -var libxul = ctypes.open('libxul.so'); - -var jenvptr = ctypes.voidptr_t; -var jclass = ctypes.voidptr_t; -var jobject = ctypes.voidptr_t; -var jvalue = ctypes.voidptr_t; -var jmethodid = ctypes.voidptr_t; -var jfieldid = ctypes.voidptr_t; - -var jboolean = ctypes.uint8_t; -var jbyte = ctypes.int8_t; -var jchar = ctypes.uint16_t; -var jshort = ctypes.int16_t; -var jint = ctypes.int32_t; -var jlong = ctypes.int64_t; -var jfloat = ctypes.float32_t; -var jdouble = ctypes.float64_t; - -var jsize = jint; -var jstring = jobject; -var jarray = jobject; -var jthrowable = jobject; - -var JNINativeInterface = new ctypes.StructType( - "JNINativeInterface", - [{reserved0: ctypes.voidptr_t}, - {reserved1: ctypes.voidptr_t}, - {reserved2: ctypes.voidptr_t}, - {reserved3: ctypes.voidptr_t}, - {GetVersion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.int32_t, - [ctypes.voidptr_t]).ptr}, - {DefineClass: new ctypes.FunctionType(ctypes.default_abi, - jclass, - [jenvptr, ctypes.char.ptr, jobject, - jbyte.array(), jsize]).ptr}, - {FindClass: new ctypes.FunctionType(ctypes.default_abi, - jclass, - [jenvptr, - ctypes.char.ptr]).ptr}, - {FromReflectedMethod: new ctypes.FunctionType(ctypes.default_abi, - jmethodid, - [jenvptr, jobject]).ptr}, - {FromReflectedField: new ctypes.FunctionType(ctypes.default_abi, - jfieldid, - [jenvptr, jobject]).ptr}, - {ToReflectedMethod: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jclass, - jmethodid]).ptr}, - {GetSuperclass: new ctypes.FunctionType(ctypes.default_abi, - jclass, [jenvptr, jclass]).ptr}, - {IsAssignableFrom: new ctypes.FunctionType(ctypes.default_abi, - jboolean, - [jenvptr, jclass, jclass]).ptr}, - {ToReflectedField: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jclass, - jfieldid]).ptr}, - {Throw: new ctypes.FunctionType(ctypes.default_abi, - jint, [jenvptr, jthrowable]).ptr}, - {ThrowNew: new ctypes.FunctionType(ctypes.default_abi, - jint, [jenvptr, jclass, - ctypes.char.ptr]).ptr}, - {ExceptionOccurred: new ctypes.FunctionType(ctypes.default_abi, - jthrowable, [jenvptr]).ptr}, - {ExceptionDescribe: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, [jenvptr]).ptr}, - {ExceptionClear: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, [jenvptr]).ptr}, - {FatalError: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, - ctypes.char.ptr]).ptr}, - {PushLocalFrame: new ctypes.FunctionType(ctypes.default_abi, - jint, - [jenvptr, jint]).ptr}, - {PopLocalFrame: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jobject]).ptr}, - {NewGlobalRef: new ctypes.FunctionType(ctypes.default_abi, - jobject, [jenvptr, jobject]).ptr}, - {DeleteGlobalRef: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, - jobject]).ptr}, - {DeleteLocalRef: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, - jobject]).ptr}, - {IsSameObject: new ctypes.FunctionType(ctypes.default_abi, - jboolean, - [jenvptr, jobject, jobject]).ptr}, - {NewLocalRef: new ctypes.FunctionType(ctypes.default_abi, - jobject, [jenvptr, jobject]).ptr}, - {EnsureLocalCapacity: new ctypes.FunctionType(ctypes.default_abi, - jint, [jenvptr, jint]).ptr}, - {AllocObject: new ctypes.FunctionType(ctypes.default_abi, - jobject, [jenvptr, jclass]).ptr}, - {NewObject: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, - jclass, - jmethodid, - "..."]).ptr}, - {NewObjectV: ctypes.voidptr_t}, - {NewObjectA: ctypes.voidptr_t}, - {GetObjectClass: new ctypes.FunctionType(ctypes.default_abi, - jclass, - [jenvptr, jobject]).ptr}, - {IsInstanceOf: new ctypes.FunctionType(ctypes.default_abi, - jboolean, - [jenvptr, jobject, jclass]).ptr}, - {GetMethodID: new ctypes.FunctionType(ctypes.default_abi, - jmethodid, - [jenvptr, - jclass, - ctypes.char.ptr, - ctypes.char.ptr]).ptr}, - {CallObjectMethod: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jobject, jmethodid, - "..."]).ptr}, - {CallObjectMethodV: ctypes.voidptr_t}, - {CallObjectMethodA: ctypes.voidptr_t}, - {CallBooleanMethod: new ctypes.FunctionType(ctypes.default_abi, - jboolean, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallBooleanMethodV: ctypes.voidptr_t}, - {CallBooleanMethodA: ctypes.voidptr_t}, - {CallByteMethod: new ctypes.FunctionType(ctypes.default_abi, - jbyte, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallByteMethodV: ctypes.voidptr_t}, - {CallByteMethodA: ctypes.voidptr_t}, - {CallCharMethod: new ctypes.FunctionType(ctypes.default_abi, - jchar, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallCharMethodV: ctypes.voidptr_t}, - {CallCharMethodA: ctypes.voidptr_t}, - {CallShortMethod: new ctypes.FunctionType(ctypes.default_abi, - jshort, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallShortMethodV: ctypes.voidptr_t}, - {CallShortMethodA: ctypes.voidptr_t}, - {CallIntMethod: new ctypes.FunctionType(ctypes.default_abi, - jint, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallIntMethodV: ctypes.voidptr_t}, - {CallIntMethodA: ctypes.voidptr_t}, - {CallLongMethod: new ctypes.FunctionType(ctypes.default_abi, - jlong, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallLongMethodV: ctypes.voidptr_t}, - {CallLongMethodA: ctypes.voidptr_t}, - {CallFloatMethod: new ctypes.FunctionType(ctypes.default_abi, - jfloat, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallFloatMethodV: ctypes.voidptr_t}, - {CallFloatMethodA: ctypes.voidptr_t}, - {CallDoubleMethod: new ctypes.FunctionType(ctypes.default_abi, - jdouble, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallDoubleMethodV: ctypes.voidptr_t}, - {CallDoubleMethodA: ctypes.voidptr_t}, - {CallVoidMethod: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, - jobject, - jmethodid, - "..."]).ptr}, - {CallVoidMethodV: ctypes.voidptr_t}, - {CallVoidMethodA: ctypes.voidptr_t}, - {CallNonvirtualObjectMethod: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualObjectMethodV: ctypes.voidptr_t}, - {CallNonvirtualObjectMethodA: ctypes.voidptr_t}, - {CallNonvirtualBooleanMethod: new ctypes.FunctionType(ctypes.default_abi, - jboolean, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualBooleanMethodV: ctypes.voidptr_t}, - {CallNonvirtualBooleanMethodA: ctypes.voidptr_t}, - {CallNonvirtualByteMethod: new ctypes.FunctionType(ctypes.default_abi, - jbyte, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualByteMethodV: ctypes.voidptr_t}, - {CallNonvirtualByteMethodA: ctypes.voidptr_t}, - {CallNonvirtualCharMethod: new ctypes.FunctionType(ctypes.default_abi, - jchar, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualCharMethodV: ctypes.voidptr_t}, - {CallNonvirtualCharMethodA: ctypes.voidptr_t}, - {CallNonvirtualShortMethod: new ctypes.FunctionType(ctypes.default_abi, - jshort, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualShortMethodV: ctypes.voidptr_t}, - {CallNonvirtualShortMethodA: ctypes.voidptr_t}, - {CallNonvirtualIntMethod: new ctypes.FunctionType(ctypes.default_abi, - jint, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualIntMethodV: ctypes.voidptr_t}, - {CallNonvirtualIntMethodA: ctypes.voidptr_t}, - {CallNonvirtualLongMethod: new ctypes.FunctionType(ctypes.default_abi, - jlong, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualLongMethodV: ctypes.voidptr_t}, - {CallNonvirtualLongMethodA: ctypes.voidptr_t}, - {CallNonvirtualFloatMethod: new ctypes.FunctionType(ctypes.default_abi, - jfloat, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualFloatMethodV: ctypes.voidptr_t}, - {CallNonvirtualFloatMethodA: ctypes.voidptr_t}, - {CallNonvirtualDoubleMethod: new ctypes.FunctionType(ctypes.default_abi, - jdouble, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualDoubleMethodV: ctypes.voidptr_t}, - {CallNonvirtualDoubleMethodA: ctypes.voidptr_t}, - {CallNonvirtualVoidMethod: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jclass, jmethodid, - "..."]).ptr}, - {CallNonvirtualVoidMethodV: ctypes.voidptr_t}, - {CallNonvirtualVoidMethodA: ctypes.voidptr_t}, - {GetFieldID: new ctypes.FunctionType(ctypes.default_abi, - jfieldid, - [jenvptr, jclass, - ctypes.char.ptr, - ctypes.char.ptr]).ptr}, - {GetObjectField: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jobject, - jfieldid]).ptr}, - {GetBooleanField: new ctypes.FunctionType(ctypes.default_abi, - jboolean, - [jenvptr, jobject, - jfieldid]).ptr}, - {GetByteField: new ctypes.FunctionType(ctypes.default_abi, - jbyte, - [jenvptr, jobject, - jfieldid]).ptr}, - {GetCharField: new ctypes.FunctionType(ctypes.default_abi, - jchar, - [jenvptr, jobject, - jfieldid]).ptr}, - {GetShortField: new ctypes.FunctionType(ctypes.default_abi, - jshort, - [jenvptr, jobject, - jfieldid]).ptr}, - {GetIntField: new ctypes.FunctionType(ctypes.default_abi, - jint, - [jenvptr, jobject, - jfieldid]).ptr}, - {GetLongField: new ctypes.FunctionType(ctypes.default_abi, - jlong, - [jenvptr, jobject, - jfieldid]).ptr}, - {GetFloatField: new ctypes.FunctionType(ctypes.default_abi, - jfloat, - [jenvptr, jobject, - jfieldid]).ptr}, - {GetDoubleField: new ctypes.FunctionType(ctypes.default_abi, - jdouble, - [jenvptr, jobject, - jfieldid]).ptr}, - {SetObjectField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jobject]).ptr}, - {SetBooleanField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jboolean]).ptr}, - {SetByteField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jbyte]).ptr}, - {SetCharField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jchar]).ptr}, - {SetShortField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jshort]).ptr}, - {SetIntField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jint]).ptr}, - {SetLongField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jlong]).ptr}, - {SetFloatField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jfloat]).ptr}, - {SetDoubleField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jobject, - jfieldid, jdouble]).ptr}, - {GetStaticMethodID: new ctypes.FunctionType(ctypes.default_abi, - jmethodid, - [jenvptr, - jclass, - ctypes.char.ptr, - ctypes.char.ptr]).ptr}, - {CallStaticObjectMethod: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticObjectMethodV: ctypes.voidptr_t}, - {CallStaticObjectMethodA: ctypes.voidptr_t}, - {CallStaticBooleanMethod: new ctypes.FunctionType(ctypes.default_abi, - jboolean, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticBooleanMethodV: ctypes.voidptr_t}, - {CallStaticBooleanMethodA: ctypes.voidptr_t}, - {CallStaticByteMethod: new ctypes.FunctionType(ctypes.default_abi, - jbyte, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticByteMethodV: ctypes.voidptr_t}, - {CallStaticByteMethodA: ctypes.voidptr_t}, - {CallStaticCharMethod: new ctypes.FunctionType(ctypes.default_abi, - jchar, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticCharMethodV: ctypes.voidptr_t}, - {CallStaticCharMethodA: ctypes.voidptr_t}, - {CallStaticShortMethod: new ctypes.FunctionType(ctypes.default_abi, - jshort, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticShortMethodV: ctypes.voidptr_t}, - {CallStaticShortMethodA: ctypes.voidptr_t}, - {CallStaticIntMethod: new ctypes.FunctionType(ctypes.default_abi, - jint, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticIntMethodV: ctypes.voidptr_t}, - {CallStaticIntMethodA: ctypes.voidptr_t}, - {CallStaticLongMethod: new ctypes.FunctionType(ctypes.default_abi, - jlong, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticLongMethodV: ctypes.voidptr_t}, - {CallStaticLongMethodA: ctypes.voidptr_t}, - {CallStaticFloatMethod: new ctypes.FunctionType(ctypes.default_abi, - jfloat, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticFloatMethodV: ctypes.voidptr_t}, - {CallStaticFloatMethodA: ctypes.voidptr_t}, - {CallStaticDoubleMethod: new ctypes.FunctionType(ctypes.default_abi, - jdouble, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticDoubleMethodV: ctypes.voidptr_t}, - {CallStaticDoubleMethodA: ctypes.voidptr_t}, - {CallStaticVoidMethod: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jmethodid, - "..."]).ptr}, - {CallStaticVoidMethodV: ctypes.voidptr_t}, - {CallStaticVoidMethodA: ctypes.voidptr_t}, - {GetStaticFieldID: new ctypes.FunctionType(ctypes.default_abi, - jfieldid, - [jenvptr, jclass, - ctypes.char.ptr, - ctypes.char.ptr]).ptr}, - {GetStaticObjectField: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jclass, - jfieldid]).ptr}, - {GetStaticBooleanField: new ctypes.FunctionType(ctypes.default_abi, - jboolean, - [jenvptr, jclass, - jfieldid]).ptr}, - {GetStaticByteField: new ctypes.FunctionType(ctypes.default_abi, - jbyte, - [jenvptr, jclass, - jfieldid]).ptr}, - {GetStaticCharField: new ctypes.FunctionType(ctypes.default_abi, - jchar, - [jenvptr, jclass, - jfieldid]).ptr}, - {GetStaticShortField: new ctypes.FunctionType(ctypes.default_abi, - jshort, - [jenvptr, jclass, - jfieldid]).ptr}, - {GetStaticIntField: new ctypes.FunctionType(ctypes.default_abi, - jint, - [jenvptr, jclass, - jfieldid]).ptr}, - {GetStaticLongField: new ctypes.FunctionType(ctypes.default_abi, - jlong, - [jenvptr, jclass, - jfieldid]).ptr}, - {GetStaticFloatField: new ctypes.FunctionType(ctypes.default_abi, - jfloat, - [jenvptr, jclass, - jfieldid]).ptr}, - {GetStaticDoubleField: new ctypes.FunctionType(ctypes.default_abi, - jdouble, - [jenvptr, jclass, - jfieldid]).ptr}, - {SetStaticObjectField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jobject]).ptr}, - {SetStaticBooleanField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jboolean]).ptr}, - {SetStaticByteField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jbyte]).ptr}, - {SetStaticCharField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jchar]).ptr}, - {SetStaticShortField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jshort]).ptr}, - {SetStaticIntField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jint]).ptr}, - {SetStaticLongField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jlong]).ptr}, - {SetStaticFloatField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jfloat]).ptr}, - {SetStaticDoubleField: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jclass, - jfieldid, jdouble]).ptr}, - - {NewString: new ctypes.FunctionType(ctypes.default_abi, - jstring, - [jenvptr, jchar.ptr, jsize]).ptr}, - {GetStringLength: new ctypes.FunctionType(ctypes.default_abi, - jsize, - [jenvptr, jstring]).ptr}, - {GetStringChars: new ctypes.FunctionType(ctypes.default_abi, - jchar.ptr, - [jenvptr, jstring, - jboolean.ptr]).ptr}, - {ReleaseStringChars: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jstring, - jchar.ptr]).ptr}, - - {NewStringUTF: new ctypes.FunctionType(ctypes.default_abi, - jstring, - [jenvptr, - ctypes.char.ptr]).ptr}, - {GetStringUTFLength: new ctypes.FunctionType(ctypes.default_abi, - jsize, - [jenvptr, jstring]).ptr}, - {GetStringUTFChars: new ctypes.FunctionType(ctypes.default_abi, - ctypes.char.ptr, - [jenvptr, jstring, - jboolean.ptr]).ptr}, - {ReleaseStringUTFChars: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jstring, - ctypes.char.ptr]).ptr}, - {GetArrayLength: new ctypes.FunctionType(ctypes.default_abi, - jsize, - [jenvptr, jarray]).ptr}, - {NewObjectArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize, - jclass, jobject]).ptr}, - {GetObjectArrayElement: new ctypes.FunctionType(ctypes.default_abi, - jobject, - [jenvptr, jarray, - jsize]).ptr}, - {SetObjectArrayElement: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jobject]).ptr}, - {NewBooleanArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize]).ptr}, - {NewByteArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize]).ptr}, - {NewCharArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize]).ptr}, - {NewShortArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize]).ptr}, - {NewIntArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize]).ptr}, - {NewLongArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize]).ptr}, - {NewFloatArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize]).ptr}, - {NewDoubleArray: new ctypes.FunctionType(ctypes.default_abi, - jarray, - [jenvptr, jsize]).ptr}, - {GetBooleanArrayElements: new ctypes.FunctionType(ctypes.default_abi, - jboolean.ptr, - [jenvptr, jarray, - jboolean.ptr]).ptr}, - {GetByteArrayElements: new ctypes.FunctionType(ctypes.default_abi, - jbyte.ptr, - [jenvptr, jarray, - jboolean.ptr]).ptr}, - {GetCharArrayElements: new ctypes.FunctionType(ctypes.default_abi, - jchar.ptr, - [jenvptr, jarray, - jboolean.ptr]).ptr}, - {GetShortArrayElements: new ctypes.FunctionType(ctypes.default_abi, - jshort.ptr, - [jenvptr, jarray, - jboolean.ptr]).ptr}, - {GetIntArrayElements: new ctypes.FunctionType(ctypes.default_abi, - jint.ptr, - [jenvptr, jarray, - jboolean.ptr]).ptr}, - {GetLongArrayElements: new ctypes.FunctionType(ctypes.default_abi, - jlong.ptr, - [jenvptr, jarray, - jboolean.ptr]).ptr}, - {GetFloatArrayElements: new ctypes.FunctionType(ctypes.default_abi, - jfloat.ptr, - [jenvptr, jarray, - jboolean.ptr]).ptr}, - {GetDoubleArrayElements: new ctypes.FunctionType(ctypes.default_abi, - jdouble.ptr, - [jenvptr, jarray, - jboolean.ptr]).ptr}, - {ReleaseBooleanArrayElements: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jboolean.ptr, - jint]).ptr}, - {ReleaseByteArrayElements: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jbyte.ptr, - jint]).ptr}, - {ReleaseCharArrayElements: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jchar.ptr, - jint]).ptr}, - {ReleaseShortArrayElements: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jshort.ptr, - jint]).ptr}, - {ReleaseIntArrayElements: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jint.ptr, - jint]).ptr}, - {ReleaseLongArrayElements: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jlong.ptr, - jint]).ptr}, - {ReleaseFloatArrayElements: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jfloat.ptr, - jint]).ptr}, - {ReleaseDoubleArrayElements: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jdouble.ptr, - jint]).ptr}, - {GetBooleanArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jboolean.array()]).ptr}, - {GetByteArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jbyte.array()]).ptr}, - {GetCharArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jchar.array()]).ptr}, - {GetShortArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jshort.array()]).ptr}, - {GetIntArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jint.array()]).ptr}, - {GetLongArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jlong.array()]).ptr}, - {GetFloatArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jfloat.array()]).ptr}, - {GetDoubleArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jdouble.array()]).ptr}, - {SetBooleanArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jboolean.array()]).ptr}, - {SetByteArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jbyte.array()]).ptr}, - {SetCharArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jchar.array()]).ptr}, - {SetShortArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jshort.array()]).ptr}, - {SetIntArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jint.array()]).ptr}, - {SetLongArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jlong.array()]).ptr}, - {SetFloatArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jfloat.array()]).ptr}, - {SetDoubleArrayRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jarray, - jsize, jsize, - jdouble.array()]).ptr}, - {RegisterNatives: ctypes.voidptr_t}, - {UnregisterNatives: ctypes.voidptr_t}, - {MonitorEnter: new ctypes.FunctionType(ctypes.default_abi, - jint, [jenvptr, jobject]).ptr}, - {MonitorExit: new ctypes.FunctionType(ctypes.default_abi, - jint, [jenvptr, jobject]).ptr}, - {GetJavaVM: ctypes.voidptr_t}, - {GetStringRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jstring, - jsize, jsize, - jchar.array()]).ptr}, - {GetStringUTFRegion: new ctypes.FunctionType(ctypes.default_abi, - ctypes.void_t, - [jenvptr, jstring, - jsize, jsize, - ctypes.char.array()]).ptr}, - {GetPrimitiveArrayCritical: ctypes.voidptr_t}, - {ReleasePrimitiveArrayCritical: ctypes.voidptr_t}, - {GetStringCritical: ctypes.voidptr_t}, - {ReleaseStringCritical: ctypes.voidptr_t}, - {NewWeakGlobalRef: ctypes.voidptr_t}, - {DeleteWeakGlobalRef: ctypes.voidptr_t}, - {ExceptionCheck: new ctypes.FunctionType(ctypes.default_abi, - jboolean, [jenvptr]).ptr}, - {NewDirectByteBuffer: ctypes.voidptr_t}, - {GetDirectBufferAddress: ctypes.voidptr_t}, - {GetDirectBufferCapacity: ctypes.voidptr_t}, - {GetObjectRefType: ctypes.voidptr_t}] -); - -var GetJNIForThread = libxul.declare("GetJNIForThread", - ctypes.default_abi, - JNINativeInterface.ptr.ptr); - -var registry = Object.create(null); -var classes = Object.create(null); - -function JNIUnloadClasses(jenv) { - Object.getOwnPropertyNames(registry).forEach(function(classname) { - var jcls = unwrap(registry[classname]); - jenv.contents.contents.DeleteGlobalRef(jenv, jcls); - - // Purge the registry, so we don't try to reuse stale global references - // in JNI calls and we garbage-collect the JS global reference objects. - delete registry[classname]; - }); - - // The refs also get added to the 'classes' object, so we should purge it too. - // That object is a hierarchical data structure organized by class path parts, - // but deleting its own properties should be sufficient to break its refs. - Object.getOwnPropertyNames(classes).forEach(function(topLevelPart) { - delete classes[topLevelPart]; - }); -} - -var PREFIX = 'js#'; -// this regex matches one component of a type signature: -// any number of array modifiers, followed by either a -// primitive type character or L<classname>; -var sigRegex = () => /\[*([VZBCSIJFD]|L([^.\/;]+(\/[^.\/;]+)*);)/g; -var ensureSig = function(classname_or_signature) { - // convert a classname into a signature, - // leaving unchanged signatures. We assume that - // anything not a valid signature is a classname. - var m = sigRegex().exec(classname_or_signature); - return (m && m[0] === classname_or_signature) ? classname_or_signature : - 'L' + classname_or_signature.replace(/\./g, '/') + ';'; -}; -var wrap = function(obj, classSig) { - if (!classSig) { return obj; } - // don't wrap primitive types. - if (classSig.charAt(0)!=='L' && - classSig.charAt(0)!=='[') { return obj; } - var proto = registry[classSig][PREFIX+'proto']; - return new proto(obj); -}; -var unwrap = function(obj, opt_jenv, opt_ctype) { - if (obj && typeof(obj)==='object' && (PREFIX+'obj') in obj) { - return obj[PREFIX+'obj']; - } else if (opt_jenv && opt_ctype) { - if (opt_ctype !== jobject) - return opt_ctype(obj); // cast to given primitive ctype - if (typeof(obj)==='string') - return unwrap(JNINewString(opt_jenv, obj)); // create Java String - } - return obj; -}; -var ensureLoaded = function(jenv, classSig) { - if (!Object.hasOwnProperty.call(registry, classSig)) { - JNILoadClass(jenv, classSig); - } - return registry[classSig]; -}; - -function JNINewString(jenv, value) { - var s = jenv.contents.contents.NewStringUTF(jenv, ctypes.char.array()(value)); - ensureLoaded(jenv, "Ljava/lang/String;"); - return wrap(s, "Ljava/lang/String;"); -} - -function JNIReadString(jenv, jstring_value) { - var val = unwrap(jstring_value); - if ((!val) || val.isNull()) { return null; } - var chars = jenv.contents.contents.GetStringUTFChars(jenv, val, null); - var result = chars.readString(); - jenv.contents.contents.ReleaseStringUTFChars(jenv, val, chars); - return result; -} - -var sigInfo = { - 'V': { name: 'Void', longName: 'Void', ctype: ctypes.void_t }, - 'Z': { name: 'Boolean', longName: 'Boolean', ctype: jboolean }, - 'B': { name: 'Byte', longName: 'Byte', ctype: jbyte }, - 'C': { name: 'Char', longName: 'Char', ctype: jchar }, - 'S': { name: 'Short', longName: 'Short', ctype: jshort }, - 'I': { name: 'Int', longName: 'Integer', ctype: jint }, - 'J': { name: 'Long', longName: 'Long', ctype: jlong }, - 'F': { name: 'Float', longName: 'Float', ctype: jfloat }, - 'D': { name: 'Double', longName: 'Double', ctype: jdouble }, - 'L': { name: 'Object', longName: 'Object', ctype: jobject }, - '[': { name: 'Object', longName: 'Object', ctype: jarray } -}; - -var sig2type = function(sig) { return sigInfo[sig.charAt(0)].name; }; -var sig2ctype = function(sig) { return sigInfo[sig.charAt(0)].ctype; }; -var sig2prim = function(sig) { return sigInfo[sig.charAt(0)].longName; }; - -// return the class object for a signature string. -// allocates 1 or 2 local refs -function JNIClassObj(jenv, classSig) { - var jenvpp = function() { return jenv.contents.contents; }; - // Deal with funny calling convention of JNI FindClass method. - // Classes get the leading & trailing chars stripped; primitives - // have to be looked up via their wrapper type. - var prim = function(ty) { - var jcls = jenvpp().FindClass(jenv, "java/lang/"+ty); - var jfld = jenvpp().GetStaticFieldID(jenv, jcls, "TYPE", - "Ljava/lang/Class;"); - return jenvpp().GetStaticObjectField(jenv, jcls, jfld); - }; - switch (classSig.charAt(0)) { - case '[': - return jenvpp().FindClass(jenv, classSig); - case 'L': - classSig = classSig.substring(1, classSig.indexOf(';')); - return jenvpp().FindClass(jenv, classSig); - default: - return prim(sig2prim(classSig)); - } -} - -// return the signature string for a Class object. -// allocates 2 local refs -function JNIClassSig(jenv, jcls) { - var jenvpp = function() { return jenv.contents.contents; }; - var jclscls = jenvpp().FindClass(jenv, "java/lang/Class"); - var jmtd = jenvpp().GetMethodID(jenv, jclscls, - "getName", "()Ljava/lang/String;"); - var name = jenvpp().CallObjectMethod(jenv, jcls, jmtd); - name = JNIReadString(jenv, name); - // API is weird. Make sure we're using slashes not dots - name = name.replace(/\./g, '/'); - // special case primitives, arrays - if (name.charAt(0)==='[') return name; - switch(name) { - case 'void': return 'V'; - case 'boolean': return 'Z'; - case 'byte': return 'B'; - case 'char': return 'C'; - case 'short': return 'S'; - case 'int': return 'I'; - case 'long': return 'J'; - case 'float': return 'F'; - case 'double': return 'D'; - default: - return 'L' + name + ';'; - } -} - -// create dispatch method -// we resolve overloaded methods only by # of arguments. If you need -// further resolution, use the 'long form' of the method name, ie: -// obj['toString()Ljava/lang/String'].call(obj); -var overloadFunc = function(basename) { - return function() { - return this[basename+'('+arguments.length+')'].apply(this, arguments); - }; -}; - -// Create appropriate wrapper fields/methods for a Java class. -function JNILoadClass(jenv, classSig, opt_props) { - var jenvpp = function() { return jenv.contents.contents; }; - var props = opt_props || {}; - - // allocate a local reference frame with enough space - // this class (1 or 2 local refs) plus superclass (3 refs) - // plus array element class (1 or 2 local refs) - var numLocals = 7; - jenvpp().PushLocalFrame(jenv, numLocals); - - var jcls; - if (Object.hasOwnProperty.call(registry, classSig)) { - jcls = unwrap(registry[classSig]); - } else { - jcls = jenvpp().NewGlobalRef(jenv, JNIClassObj(jenv, classSig)); - - // get name of superclass - var jsuper = jenvpp().GetSuperclass(jenv, jcls); - if (jsuper.isNull()) { - jsuper = null; - } else { - jsuper = JNIClassSig(jenv, jsuper); - } - - registry[classSig] = Object.create(jsuper?ensureLoaded(jenv, jsuper):null); - registry[classSig][PREFIX+'obj'] = jcls; // global ref, persistent. - registry[classSig][PREFIX+'proto'] = - function(o) { this[PREFIX+'obj'] = o; }; - registry[classSig][PREFIX+'proto'].prototype = - Object.create(jsuper ? - ensureLoaded(jenv, jsuper)[PREFIX+'proto'].prototype : - null); - // Add a __cast__ method to the wrapper corresponding to the class - registry[classSig].__cast__ = function(obj) { - return wrap(unwrap(obj), classSig); - }; - - // make wrapper accessible via the classes object. - var path = sig2type(classSig).toLowerCase(); - if (classSig.charAt(0)==='L') { - path = classSig.substring(1, classSig.length-1); - } - if (classSig.charAt(0)!=='[') { - var root = classes, i; - var parts = path.split('/'); - for (i = 0; i < parts.length-1; i++) { - if (!Object.hasOwnProperty.call(root, parts[i])) { - root[parts[i]] = Object.create(null); - } - root = root[parts[i]]; - } - root[parts[parts.length-1]] = registry[classSig]; - } - } - - var r = registry[classSig]; - var rpp = r[PREFIX+'proto'].prototype; - - if (classSig.charAt(0)==='[') { - // add 'length' field for arrays - Object.defineProperty(rpp, 'length', { - get: function() { - return jenvpp().GetArrayLength(jenv, unwrap(this)); - } - }); - // add 'get' and 'set' methods, 'new' constructor - var elemSig = classSig.substring(1); - ensureLoaded(jenv, elemSig); - - registry[elemSig].__array__ = r; - if (!Object.hasOwnProperty.call(registry[elemSig], 'array')) - registry[elemSig].array = r; - - if (elemSig.charAt(0)==='L' || elemSig.charAt(0)==='[') { - var elemClass = unwrap(registry[elemSig]); - - rpp.get = function(idx) { - return wrap(jenvpp().GetObjectArrayElement(jenv, unwrap(this), idx), - elemSig); - }; - rpp.set = function(idx, value) { - jenvpp().SetObjectArrayElement(jenv, unwrap(this), idx, - unwrap(value, jenv, jobject)); - }; - rpp.getElements = function(start, len) { - var i, r=[]; - for (i=0; i<len; i++) { r.push(this.get(start+i)); } - return r; - }; - rpp.setElements = function(start, vals) { - vals.forEach(function(v, i) { this.set(start+i, v); }.bind(this)); - }; - r['new'] = function(length) { - return wrap(jenvpp().NewObjectArray(jenv, length, elemClass, null), - classSig); - }; - } else { - var ty = sig2type(elemSig), ctype = sig2ctype(elemSig); - var constructor = "New"+ty+"Array"; - var getter = "Get"+ty+"ArrayRegion"; - var setter = "Set"+ty+"ArrayRegion"; - rpp.get = function(idx) { return this.getElements(idx, 1)[0]; }; - rpp.set = function(idx, val) { this.setElements(idx, [val]); }; - rpp.getElements = function(start, len) { - var j = jenvpp(); - var buf = new (ctype.array())(len); - j[getter].call(j, jenv, unwrap(this), start, len, buf); - return buf; - }; - rpp.setElements = function(start, vals) { - var j = jenvpp(); - j[setter].call(j, jenv, unwrap(this), start, vals.length, - ctype.array()(vals)); - }; - r['new'] = function(length) { - var j = jenvpp(); - return wrap(j[constructor].call(j, jenv, length), classSig); - }; - } - } - - (props.static_fields || []).forEach(function(fld) { - var jfld = jenvpp().GetStaticFieldID(jenv, jcls, fld.name, fld.sig); - var ty = sig2type(fld.sig), nm = fld.sig; - var getter = "GetStatic"+ty+"Field", setter = "SetStatic"+ty+"Field"; - ensureLoaded(jenv, nm); - var props = { - get: function() { - var j = jenvpp(); - return wrap(j[getter].call(j, jenv, jcls, jfld), nm); - }, - set: function(newValue) { - var j = jenvpp(); - j[setter].call(j, jenv, jcls, jfld, unwrap(newValue)); - } - }; - Object.defineProperty(r, fld.name, props); - // add static fields to object instances, too. - Object.defineProperty(rpp, fld.name, props); - }); - (props.static_methods || []).forEach(function(mtd) { - var jmtd = jenvpp().GetStaticMethodID(jenv, jcls, mtd.name, mtd.sig); - var argctypes = mtd.sig.match(sigRegex()).map(s => sig2ctype(s)); - var returnSig = mtd.sig.substring(mtd.sig.indexOf(')')+1); - var ty = sig2type(returnSig), nm = returnSig; - var call = "CallStatic"+ty+"Method"; - ensureLoaded(jenv, nm); - r[mtd.name] = rpp[mtd.name] = overloadFunc(mtd.name); - r[mtd.name + mtd.sig] = r[mtd.name+'('+(argctypes.length-1)+')'] = - // add static methods to object instances, too. - rpp[mtd.name + mtd.sig] = rpp[mtd.name+'('+(argctypes.length-1)+')'] = function() { - var i, j = jenvpp(); - var args = [jenv, jcls, jmtd]; - for (i=0; i<arguments.length; i++) { - args.push(unwrap(arguments[i], jenv, argctypes[i])); - } - return wrap(j[call].apply(j, args), nm); - }; - }); - (props.constructors || []).forEach(function(mtd) { - mtd.name = "<init>"; - var jmtd = jenvpp().GetMethodID(jenv, jcls, mtd.name, mtd.sig); - var argctypes = mtd.sig.match(sigRegex()).map(s => sig2ctype(s)); - var returnSig = mtd.sig.substring(mtd.sig.indexOf(')')+1); - - r['new'] = overloadFunc('new'); - r['new'+mtd.sig] = r['new('+(argctypes.length-1)+')'] = function() { - var i, j = jenvpp(); - var args = [jenv, jcls, jmtd]; - for (i=0; i<arguments.length; i++) { - args.push(unwrap(arguments[i], jenv, argctypes[i])); - } - return wrap(j.NewObject.apply(j, args), classSig); - }; - }); - (props.fields || []).forEach(function(fld) { - var jfld = jenvpp().GetFieldID(jenv, jcls, fld.name, fld.sig); - var ty = sig2type(fld.sig), nm = fld.sig; - var getter = "Get"+ty+"Field", setter = "Set"+ty+"Field"; - ensureLoaded(jenv, nm); - Object.defineProperty(rpp, fld.name, { - get: function() { - var j = jenvpp(); - return wrap(j[getter].call(j, jenv, unwrap(this), jfld), nm); - }, - set: function(newValue) { - var j = jenvpp(); - j[setter].call(j, jenv, unwrap(this), jfld, unwrap(newValue)); - } - }); - }); - (props.methods || []).forEach(function(mtd) { - var jmtd = jenvpp().GetMethodID(jenv, jcls, mtd.name, mtd.sig); - var argctypes = mtd.sig.match(sigRegex()).map(s => sig2ctype(s)); - var returnSig = mtd.sig.substring(mtd.sig.indexOf(')')+1); - var ty = sig2type(returnSig), nm = returnSig; - var call = "Call"+ty+"Method"; - ensureLoaded(jenv, nm); - rpp[mtd.name] = overloadFunc(mtd.name); - rpp[mtd.name + mtd.sig] = rpp[mtd.name+'('+(argctypes.length-1)+')'] = function() { - var i, j = jenvpp(); - var args = [jenv, unwrap(this), jmtd]; - for (i=0; i<arguments.length; i++) { - args.push(unwrap(arguments[i], jenv, argctypes[i])); - } - return wrap(j[call].apply(j, args), nm); - }; - }); - jenvpp().PopLocalFrame(jenv, null); - return r; -} - -// exported object -var JNI = { - // primitive types - jboolean: jboolean, - jbyte: jbyte, - jchar: jchar, - jshort: jshort, - jint: jint, - jlong: jlong, - jfloat: jfloat, - jdouble: jdouble, - jsize: jsize, - - // class registry - classes: classes, - - // methods - GetForThread: GetJNIForThread, - NewString: JNINewString, - ReadString: JNIReadString, - LoadClass: function(jenv, classname_or_signature, props) { - return JNILoadClass(jenv, ensureSig(classname_or_signature), props); - }, - UnloadClasses: JNIUnloadClasses -}; |