Skip to content

Instantly share code, notes, and snippets.

@aji
Created July 20, 2012 20:26
Show Gist options
  • Save aji/3153029 to your computer and use it in GitHub Desktop.
Save aji/3153029 to your computer and use it in GitHub Desktop.
putting the JNI into no-bullshit mode
/* The C JNIEnv typedef looks like this: */
typedef const struct JNINativeInterface_ *JNIEnv;
/* These are the useful members of the struct JNINativeInterface_ with a
smidge of sed to clear away the clutter. Additionally, each /(.*)V/
method has matching "\1A" and "\1" alternatives, i.e., if you see this:
jobject (*NewObjectV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
Then it really means this:
jobject (*NewObject) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
jobject (*NewObjectV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jobject (*NewObjectA) (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
This was done for clarity/brevity.
*/
jint (*GetVersion)(JNIEnv *env);
jclass (*DefineClass) (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len);
jclass (*FindClass) (JNIEnv *env, const char *name);
jmethodID (*FromReflectedMethod) (JNIEnv *env, jobject method);
jfieldID (*FromReflectedField) (JNIEnv *env, jobject field);
jobject (*ToReflectedMethod) (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);
jclass (*GetSuperclass) (JNIEnv *env, jclass sub);
jboolean (*IsAssignableFrom) (JNIEnv *env, jclass sub, jclass sup);
jobject (*ToReflectedField) (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);
jint (*Throw) (JNIEnv *env, jthrowable obj);
jint (*ThrowNew) (JNIEnv *env, jclass clazz, const char *msg);
jthrowable (*ExceptionOccurred) (JNIEnv *env);
void (*ExceptionDescribe) (JNIEnv *env);
void (*ExceptionClear) (JNIEnv *env);
void (*FatalError) (JNIEnv *env, const char *msg);
jint (*PushLocalFrame) (JNIEnv *env, jint capacity);
jobject (*PopLocalFrame) (JNIEnv *env, jobject result);
jobject (*NewGlobalRef) (JNIEnv *env, jobject lobj);
void (*DeleteGlobalRef) (JNIEnv *env, jobject gref);
void (*DeleteLocalRef) (JNIEnv *env, jobject obj);
jboolean (*IsSameObject) (JNIEnv *env, jobject obj1, jobject obj2);
jobject (*NewLocalRef) (JNIEnv *env, jobject ref);
jint (*EnsureLocalCapacity) (JNIEnv *env, jint capacity);
jobject (*AllocObject) (JNIEnv *env, jclass clazz);
jobject (*NewObjectV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jclass (*GetObjectClass) (JNIEnv *env, jobject obj);
jboolean (*IsInstanceOf) (JNIEnv *env, jobject obj, jclass clazz);
jmethodID (*GetMethodID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
jobject (*CallObjectMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jboolean (*CallBooleanMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jbyte (*CallByteMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jchar (*CallCharMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jshort (*CallShortMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jint (*CallIntMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jlong (*CallLongMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jfloat (*CallFloatMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jdouble (*CallDoubleMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
void (*CallVoidMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
jobject (*CallNonvirtualObjectMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jboolean (*CallNonvirtualBooleanMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jbyte (*CallNonvirtualByteMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jchar (*CallNonvirtualCharMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jshort (*CallNonvirtualShortMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jint (*CallNonvirtualIntMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jlong (*CallNonvirtualLongMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jfloat (*CallNonvirtualFloatMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jdouble (*CallNonvirtualDoubleMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
void (*CallNonvirtualVoidMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
jfieldID (*GetFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
jobject (*GetObjectField) (JNIEnv *env, jobject obj, jfieldID fieldID);
jboolean (*GetBooleanField) (JNIEnv *env, jobject obj, jfieldID fieldID);
jbyte (*GetByteField) (JNIEnv *env, jobject obj, jfieldID fieldID);
jchar (*GetCharField) (JNIEnv *env, jobject obj, jfieldID fieldID);
jshort (*GetShortField) (JNIEnv *env, jobject obj, jfieldID fieldID);
jint (*GetIntField) (JNIEnv *env, jobject obj, jfieldID fieldID);
jlong (*GetLongField) (JNIEnv *env, jobject obj, jfieldID fieldID);
jfloat (*GetFloatField) (JNIEnv *env, jobject obj, jfieldID fieldID);
jdouble (*GetDoubleField) (JNIEnv *env, jobject obj, jfieldID fieldID);
void (*SetObjectField) (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
void (*SetBooleanField) (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
void (*SetByteField) (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
void (*SetCharField) (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
void (*SetShortField) (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
void (*SetIntField) (JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
void (*SetLongField) (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
void (*SetFloatField) (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
void (*SetDoubleField) (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
jmethodID (*GetStaticMethodID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
jobject (*CallStaticObjectMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jboolean (*CallStaticBooleanMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jbyte (*CallStaticByteMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jchar (*CallStaticCharMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jshort (*CallStaticShortMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jint (*CallStaticIntMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jlong (*CallStaticLongMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jfloat (*CallStaticFloatMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
jdouble (*CallStaticDoubleMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
void (*CallStaticVoidMethodV) (JNIEnv *env, jclass cls, jmethodID methodID, va_list args);
jfieldID (*GetStaticFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
jobject (*GetStaticObjectField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
jboolean (*GetStaticBooleanField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
jbyte (*GetStaticByteField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
jchar (*GetStaticCharField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
jshort (*GetStaticShortField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
jint (*GetStaticIntField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
jlong (*GetStaticLongField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
jfloat (*GetStaticFloatField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
jdouble (*GetStaticDoubleField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
void (*SetStaticObjectField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);
void (*SetStaticBooleanField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);
void (*SetStaticByteField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);
void (*SetStaticCharField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);
void (*SetStaticShortField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);
void (*SetStaticIntField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
void (*SetStaticLongField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);
void (*SetStaticFloatField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);
void (*SetStaticDoubleField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);
jstring (*NewString) (JNIEnv *env, const jchar *unicode, jsize len);
jsize (*GetStringLength) (JNIEnv *env, jstring str);
const jchar *(*GetStringChars) (JNIEnv *env, jstring str, jboolean *isCopy);
void (*ReleaseStringChars) (JNIEnv *env, jstring str, const jchar *chars);
jstring (*NewStringUTF) (JNIEnv *env, const char *utf);
jsize (*GetStringUTFLength) (JNIEnv *env, jstring str);
const char* (*GetStringUTFChars) (JNIEnv *env, jstring str, jboolean *isCopy);
void (*ReleaseStringUTFChars) (JNIEnv *env, jstring str, const char* chars);
jsize (*GetArrayLength) (JNIEnv *env, jarray array);
jobjectArray (*NewObjectArray) (JNIEnv *env, jsize len, jclass clazz, jobject init);
jobject (*GetObjectArrayElement) (JNIEnv *env, jobjectArray array, jsize index);
void (*SetObjectArrayElement) (JNIEnv *env, jobjectArray array, jsize index, jobject val);
jbooleanArray (*NewBooleanArray) (JNIEnv *env, jsize len);
jbyteArray (*NewByteArray) (JNIEnv *env, jsize len);
jcharArray (*NewCharArray) (JNIEnv *env, jsize len);
jshortArray (*NewShortArray) (JNIEnv *env, jsize len);
jintArray (*NewIntArray) (JNIEnv *env, jsize len);
jlongArray (*NewLongArray) (JNIEnv *env, jsize len);
jfloatArray (*NewFloatArray) (JNIEnv *env, jsize len);
jdoubleArray (*NewDoubleArray) (JNIEnv *env, jsize len);
jboolean * (*GetBooleanArrayElements) (JNIEnv *env, jbooleanArray array, jboolean *isCopy);
jbyte * (*GetByteArrayElements) (JNIEnv *env, jbyteArray array, jboolean *isCopy);
jchar * (*GetCharArrayElements) (JNIEnv *env, jcharArray array, jboolean *isCopy);
jshort * (*GetShortArrayElements) (JNIEnv *env, jshortArray array, jboolean *isCopy);
jint * (*GetIntArrayElements) (JNIEnv *env, jintArray array, jboolean *isCopy);
jlong * (*GetLongArrayElements) (JNIEnv *env, jlongArray array, jboolean *isCopy);
jfloat * (*GetFloatArrayElements) (JNIEnv *env, jfloatArray array, jboolean *isCopy);
jdouble * (*GetDoubleArrayElements) (JNIEnv *env, jdoubleArray array, jboolean *isCopy);
void (*ReleaseBooleanArrayElements) (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);
void (*ReleaseByteArrayElements) (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);
void (*ReleaseCharArrayElements) (JNIEnv *env, jcharArray array, jchar *elems, jint mode);
void (*ReleaseShortArrayElements) (JNIEnv *env, jshortArray array, jshort *elems, jint mode);
void (*ReleaseIntArrayElements) (JNIEnv *env, jintArray array, jint *elems, jint mode);
void (*ReleaseLongArrayElements) (JNIEnv *env, jlongArray array, jlong *elems, jint mode);
void (*ReleaseFloatArrayElements) (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);
void (*ReleaseDoubleArrayElements) (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);
void (*GetBooleanArrayRegion) (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
void (*GetByteArrayRegion) (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
void (*GetCharArrayRegion) (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
void (*GetShortArrayRegion) (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
void (*GetIntArrayRegion) (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
void (*GetLongArrayRegion) (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
void (*GetFloatArrayRegion) (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
void (*GetDoubleArrayRegion) (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
void (*SetBooleanArrayRegion) (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf);
void (*SetByteArrayRegion) (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf);
void (*SetCharArrayRegion) (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf);
void (*SetShortArrayRegion) (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf);
void (*SetIntArrayRegion) (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf);
void (*SetLongArrayRegion) (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf);
void (*SetFloatArrayRegion) (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf);
void (*SetDoubleArrayRegion) (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf);
jint (*RegisterNatives) (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);
jint (*UnregisterNatives) (JNIEnv *env, jclass clazz);
jint (*MonitorEnter) (JNIEnv *env, jobject obj);
jint (*MonitorExit) (JNIEnv *env, jobject obj);
jint (*GetJavaVM) (JNIEnv *env, JavaVM **vm);
void (*GetStringRegion) (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);
void (*GetStringUTFRegion) (JNIEnv *env, jstring str, jsize start, jsize len, char *buf);
void * (*GetPrimitiveArrayCritical) (JNIEnv *env, jarray array, jboolean *isCopy);
void (*ReleasePrimitiveArrayCritical) (JNIEnv *env, jarray array, void *carray, jint mode);
const jchar * (*GetStringCritical) (JNIEnv *env, jstring string, jboolean *isCopy);
void (*ReleaseStringCritical) (JNIEnv *env, jstring string, const jchar *cstring);
jweak (*NewWeakGlobalRef) (JNIEnv *env, jobject obj);
void (*DeleteWeakGlobalRef) (JNIEnv *env, jweak ref);
jboolean (*ExceptionCheck) (JNIEnv *env);
jobject (*NewDirectByteBuffer) (JNIEnv* env, void* address, jlong capacity);
void* (*GetDirectBufferAddress) (JNIEnv* env, jobject buf);
jlong (*GetDirectBufferCapacity) (JNIEnv* env, jobject buf);
/* New JNI 1.6 Features */
jobjectRefType (*GetObjectRefType) (JNIEnv* env, jobject obj);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment