Skip to content

Instantly share code, notes, and snippets.

@eeejay
Created September 22, 2011 22:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save eeejay/1236179 to your computer and use it in GitHub Desktop.
Save eeejay/1236179 to your computer and use it in GitHub Desktop.
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 jclass = ctypes.voidptr_t;
var jobject = ctypes.voidptr_t;
var jvalue = ctypes.voidptr_t;
var jmethodid = ctypes.voidptr_t;
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: ctypes.voidptr_t},
{FindClass: new ctypes.FunctionType(ctypes.default_abi,
jclass,
[ctypes.voidptr_t,
ctypes.char.ptr]).ptr},
{FromReflectedMethod: ctypes.voidptr_t},
{FromReflectedField: ctypes.voidptr_t},
{ToReflectedMethod: ctypes.voidptr_t},
{GetSuperclass: new ctypes.FunctionType(ctypes.default_abi,
jclass, [ctypes.voidptr_t, jclass]).ptr},
{IsAssignableFrom: ctypes.voidptr_t},
{ToReflectedField: ctypes.voidptr_t},
{Throw: ctypes.voidptr_t},
{ThrowNew: ctypes.voidptr_t},
{ExceptionOccurred: ctypes.voidptr_t},
{ExceptionDescribe: ctypes.voidptr_t},
{ExceptionClear: ctypes.voidptr_t},
{FatalError: ctypes.voidptr_t},
{PushLocalFrame: ctypes.voidptr_t},
{PopLocalFrame: ctypes.voidptr_t},
{NewGlobalRef: ctypes.voidptr_t},
{DeleteGlobalRef: ctypes.voidptr_t},
{DeleteLocalRef: new ctypes.FunctionType(ctypes.default_abi,
ctypes.void_t,
[ctypes.voidptr_t,
jobject]).ptr},
{IsSameObject: ctypes.voidptr_t},
{NewLocalRef: ctypes.voidptr_t},
{EnsureLocalCapacity: ctypes.voidptr_t},
{AllocObject: ctypes.voidptr_t},
{NewObject: new ctypes.FunctionType(ctypes.default_abi,
jobject,
[ctypes.voidptr_t,
jclass,
jmethodid,
"..."]).ptr},
{NewObjectV: ctypes.voidptr_t},
{NewObjectA: ctypes.voidptr_t},
{GetObjectClass: ctypes.voidptr_t},
{IsInstanceOf: ctypes.voidptr_t},
{GetMethodID: new ctypes.FunctionType(ctypes.default_abi,
jmethodid,
[ctypes.voidptr_t,
jclass,
ctypes.char.ptr,
ctypes.char.ptr]).ptr},
{CallObjectMethod: ctypes.voidptr_t},
{CallObjectMethodV: ctypes.voidptr_t},
{CallObjectMethodA: ctypes.voidptr_t},
{CallBooleanMethod: new ctypes.FunctionType(ctypes.default_abi,
ctypes.uint8_t,
[ctypes.voidptr_t,
jobject,
jmethodid,
"..."]).ptr},
{CallBooleanMethodV: ctypes.voidptr_t},
{CallBooleanMethodA: ctypes.voidptr_t},
{CallByteMethod: ctypes.voidptr_t},
{CallByteMethodV: ctypes.voidptr_t},
{CallByteMethodA: ctypes.voidptr_t},
{CallCharMethod: ctypes.voidptr_t},
{CallCharMethodV: ctypes.voidptr_t},
{CallCharMethodA: ctypes.voidptr_t},
{CallShortMethod: ctypes.voidptr_t},
{CallShortMethodV: ctypes.voidptr_t},
{CallShortMethodA: ctypes.voidptr_t},
{CallIntMethod: ctypes.voidptr_t},
{CallIntMethodV: ctypes.voidptr_t},
{CallIntMethodA: ctypes.voidptr_t},
{CallLongMethod: ctypes.voidptr_t},
{CallLongMethodV: ctypes.voidptr_t},
{CallLongMethodA: ctypes.voidptr_t},
{CallFloatMethod: ctypes.voidptr_t},
{CallFloatMethodV: ctypes.voidptr_t},
{CallFloatMethodA: ctypes.voidptr_t},
{CallDoubleMethod: ctypes.voidptr_t},
{CallDoubleMethodV: ctypes.voidptr_t},
{CallDoubleMethodA: ctypes.voidptr_t},
{CallVoidMethod: new ctypes.FunctionType(ctypes.default_abi,
ctypes.void_t,
[ctypes.voidptr_t,
jobject,
jmethodid,
"..."]).ptr},
{CallVoidMethodV: ctypes.voidptr_t},
{CallVoidMethodA: ctypes.voidptr_t},
{CallNonvirtualObjectMethod: ctypes.voidptr_t},
{CallNonvirtualObjectMethodV: ctypes.voidptr_t},
{CallNonvirtualObjectMethodA: ctypes.voidptr_t},
{CallNonvirtualBooleanMethod: ctypes.voidptr_t},
{CallNonvirtualBooleanMethodV: ctypes.voidptr_t},
{CallNonvirtualBooleanMethodA: ctypes.voidptr_t},
{CallNonvirtualByteMethod: ctypes.voidptr_t},
{CallNonvirtualByteMethodV: ctypes.voidptr_t},
{CallNonvirtualByteMethodA: ctypes.voidptr_t},
{CallNonvirtualCharMethod: ctypes.voidptr_t},
{CallNonvirtualCharMethodV: ctypes.voidptr_t},
{CallNonvirtualCharMethodA: ctypes.voidptr_t},
{CallNonvirtualShortMethod: ctypes.voidptr_t},
{CallNonvirtualShortMethodV: ctypes.voidptr_t},
{CallNonvirtualShortMethodA: ctypes.voidptr_t},
{CallNonvirtualIntMethod: ctypes.voidptr_t},
{CallNonvirtualIntMethodV: ctypes.voidptr_t},
{CallNonvirtualIntMethodA: ctypes.voidptr_t},
{CallNonvirtualLongMethod: ctypes.voidptr_t},
{CallNonvirtualLongMethodV: ctypes.voidptr_t},
{CallNonvirtualLongMethodA: ctypes.voidptr_t},
{CallNonvirtualFloatMethod: ctypes.voidptr_t},
{CallNonvirtualFloatMethodV: ctypes.voidptr_t},
{CallNonvirtualFloatMethodA: ctypes.voidptr_t},
{CallNonvirtualDoubleMethod: ctypes.voidptr_t},
{CallNonvirtualDoubleMethodV: ctypes.voidptr_t},
{CallNonvirtualDoubleMethodA: ctypes.voidptr_t},
{CallNonvirtualVoidMethod: ctypes.voidptr_t},
{CallNonvirtualVoidMethodV: ctypes.voidptr_t},
{CallNonvirtualVoidMethodA: ctypes.voidptr_t},
{GetFieldID: ctypes.voidptr_t},
{GetObjectField: ctypes.voidptr_t},
{GetBooleanField: ctypes.voidptr_t},
{GetByteField: ctypes.voidptr_t},
{GetCharField: ctypes.voidptr_t},
{GetShortField: ctypes.voidptr_t},
{GetIntField: ctypes.voidptr_t},
{GetLongField: ctypes.voidptr_t},
{GetFloatField: ctypes.voidptr_t},
{GetDoubleField: ctypes.voidptr_t},
{SetObjectField: ctypes.voidptr_t},
{SetBooleanField: ctypes.voidptr_t},
{SetByteField: ctypes.voidptr_t},
{SetCharField: ctypes.voidptr_t},
{SetShortField: ctypes.voidptr_t},
{SetIntField: ctypes.voidptr_t},
{SetLongField: ctypes.voidptr_t},
{SetFloatField: ctypes.voidptr_t},
{SetDoubleField: ctypes.voidptr_t},
{GetStaticMethodID: ctypes.voidptr_t},
{CallStaticObjectMethod: ctypes.voidptr_t},
{CallStaticObjectMethodV: ctypes.voidptr_t},
{CallStaticObjectMethodA: ctypes.voidptr_t},
{CallStaticBooleanMethod: ctypes.voidptr_t},
{CallStaticBooleanMethodV: ctypes.voidptr_t},
{CallStaticBooleanMethodA: ctypes.voidptr_t},
{CallStaticByteMethod: ctypes.voidptr_t},
{CallStaticByteMethodV: ctypes.voidptr_t},
{CallStaticByteMethodA: ctypes.voidptr_t},
{CallStaticCharMethod: ctypes.voidptr_t},
{CallStaticCharMethodV: ctypes.voidptr_t},
{CallStaticCharMethodA: ctypes.voidptr_t},
{CallStaticShortMethod: ctypes.voidptr_t},
{CallStaticShortMethodV: ctypes.voidptr_t},
{CallStaticShortMethodA: ctypes.voidptr_t},
{CallStaticIntMethod: ctypes.voidptr_t},
{CallStaticIntMethodV: ctypes.voidptr_t},
{CallStaticIntMethodA: ctypes.voidptr_t},
{CallStaticLongMethod: ctypes.voidptr_t},
{CallStaticLongMethodV: ctypes.voidptr_t},
{CallStaticLongMethodA: ctypes.voidptr_t},
{CallStaticFloatMethod: ctypes.voidptr_t},
{CallStaticFloatMethodV: ctypes.voidptr_t},
{CallStaticFloatMethodA: ctypes.voidptr_t},
{CallStaticDoubleMethod: ctypes.voidptr_t},
{CallStaticDoubleMethodV: ctypes.voidptr_t},
{CallStaticDoubleMethodA: ctypes.voidptr_t},
{CallStaticVoidMethod: ctypes.voidptr_t},
{CallStaticVoidMethodV: ctypes.voidptr_t},
{CallStaticVoidMethodA: ctypes.voidptr_t},
{GetStaticFieldID: ctypes.voidptr_t},
{GetStaticObjectField: ctypes.voidptr_t},
{GetStaticBooleanField: ctypes.voidptr_t},
{GetStaticByteField: ctypes.voidptr_t},
{GetStaticCharField: ctypes.voidptr_t},
{GetStaticShortField: ctypes.voidptr_t},
{GetStaticIntField: ctypes.voidptr_t},
{GetStaticLongField: ctypes.voidptr_t},
{GetStaticFloatField: ctypes.voidptr_t},
{GetStaticDoubleField: ctypes.voidptr_t},
{SetStaticObjectField: ctypes.voidptr_t},
{SetStaticBooleanField: ctypes.voidptr_t},
{SetStaticByteField: ctypes.voidptr_t},
{SetStaticCharField: ctypes.voidptr_t},
{SetStaticShortField: ctypes.voidptr_t},
{SetStaticIntField: ctypes.voidptr_t},
{SetStaticLongField: ctypes.voidptr_t},
{SetStaticFloatField: ctypes.voidptr_t},
{SetStaticDoubleField: ctypes.voidptr_t},
{NewString: ctypes.voidptr_t},
{GetStringLength: ctypes.voidptr_t},
{GetStringChars: ctypes.voidptr_t},
{ReleaseStringChars: ctypes.voidptr_t},
{NewStringUTF: new ctypes.FunctionType(ctypes.default_abi,
jobject,
[ctypes.voidptr_t,
ctypes.char.ptr]).ptr},
{GetStringUTFLength: ctypes.voidptr_t},
{GetStringUTFChars: ctypes.voidptr_t},
{ReleaseStringUTFChars: ctypes.voidptr_t},
{GetArrayLength: ctypes.voidptr_t},
{NewObjectArray: ctypes.voidptr_t},
{GetObjectArrayElement: ctypes.voidptr_t},
{SetObjectArrayElement: ctypes.voidptr_t},
{NewBooleanArray: ctypes.voidptr_t},
{NewByteArray: ctypes.voidptr_t},
{NewCharArray: ctypes.voidptr_t},
{NewShortArray: ctypes.voidptr_t},
{NewIntArray: ctypes.voidptr_t},
{NewLongArray: ctypes.voidptr_t},
{NewFloatArray: ctypes.voidptr_t},
{NewDoubleArray: ctypes.voidptr_t},
{GetBooleanArrayElements: ctypes.voidptr_t},
{GetByteArrayElements: ctypes.voidptr_t},
{GetCharArrayElements: ctypes.voidptr_t},
{GetShortArrayElements: ctypes.voidptr_t},
{GetIntArrayElements: ctypes.voidptr_t},
{GetLongArrayElements: ctypes.voidptr_t},
{GetFloatArrayElements: ctypes.voidptr_t},
{GetDoubleArrayElements: ctypes.voidptr_t},
{ReleaseBooleanArrayElements: ctypes.voidptr_t},
{ReleaseByteArrayElements: ctypes.voidptr_t},
{ReleaseCharArrayElements: ctypes.voidptr_t},
{ReleaseShortArrayElements: ctypes.voidptr_t},
{ReleaseIntArrayElements: ctypes.voidptr_t},
{ReleaseLongArrayElements: ctypes.voidptr_t},
{ReleaseFloatArrayElements: ctypes.voidptr_t},
{ReleaseDoubleArrayElements: ctypes.voidptr_t},
{GetBooleanArrayRegion: ctypes.voidptr_t},
{GetByteArrayRegion: ctypes.voidptr_t},
{GetCharArrayRegion: ctypes.voidptr_t},
{GetShortArrayRegion: ctypes.voidptr_t},
{GetIntArrayRegion: ctypes.voidptr_t},
{GetLongArrayRegion: ctypes.voidptr_t},
{GetFloatArrayRegion: ctypes.voidptr_t},
{GetDoubleArrayRegion: ctypes.voidptr_t},
{SetBooleanArrayRegion: ctypes.voidptr_t},
{SetByteArrayRegion: ctypes.voidptr_t},
{SetCharArrayRegion: ctypes.voidptr_t},
{SetShortArrayRegion: ctypes.voidptr_t},
{SetIntArrayRegion: ctypes.voidptr_t},
{SetLongArrayRegion: ctypes.voidptr_t},
{SetFloatArrayRegion: ctypes.voidptr_t},
{SetDoubleArrayRegion: ctypes.voidptr_t},
{RegisterNatives: ctypes.voidptr_t},
{UnregisterNatives: ctypes.voidptr_t},
{MonitorEnter: ctypes.voidptr_t},
{MonitorExit: ctypes.voidptr_t},
{GetJavaVM: ctypes.voidptr_t},
{GetStringRegion: ctypes.voidptr_t},
{GetStringUTFRegion: ctypes.voidptr_t},
{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: ctypes.voidptr_t},
{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);
android_log(3, "JNITest", "Started");
var jenv = GetJNIForThread();
android_log(3, "JNITest", "env: " + jenv);
var jcls = jenv.contents.contents.FindClass(jenv, "android.speech.tts.TextToSpeech");
android_log(3, "JNITest", "class: " + jcls);
android_log(3, "JNITest", "Done");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment