#include "natcStartup.h" static jthrowable error; void jvm_destroy() { if (JG(jvm)) { (*JG(jvm))->DetachCurrentThread(JG(jvm)); (*JG(jvm))->DestroyJavaVM(JG(jvm)); JG(jvm) = 0; } JG(jenv) = 0; } static void abort_on_error(jthrowable error) { if(!error) return; jclass errClass; jmethodID toString; jobject errString; const char *errAsUTF; jboolean isCopy; JNIEnv *jenv = JG(jenv); (*jenv)->ExceptionClear(jenv); errClass = (*jenv)->GetObjectClass(jenv, error); toString = (*jenv)->GetMethodID(jenv, errClass, "toString", "()Ljava/lang/String;"); errString = (*jenv)->CallObjectMethod(jenv, error, toString); errAsUTF = (*jenv)->GetStringUTFChars(jenv, errString, &isCopy); //printf("Error: %s", errAsUTF); fprintf(stderr, errAsUTF); if (isCopy) (*jenv)->ReleaseStringUTFChars(jenv, error, errAsUTF); jvm_destroy(); abort(); } extern JNIEXPORT void JNICALL Java_com_inet_report_encode_ImageDecoderPixbuf_initState (JNIEnv *env, jclass clazz); extern JNIEXPORT void JNICALL Java_com_inet_report_encode_ImageDecoderPixbuf_scanImage (JNIEnv *env, jobject job, jbyteArray _buffer); JNINativeMethod pixbuf[]={ {"initState", "()V", Java_com_inet_report_encode_ImageDecoderPixbuf_initState}, {"scanImage", "([B)V", Java_com_inet_report_encode_ImageDecoderPixbuf_scanImage}, }; struct NativeMethods { char*class; JNINativeMethod*meth; int n; } meths[]={ {"com.inet.report.encode.ImageDecoderPixbuf", pixbuf, (sizeof pixbuf)/(sizeof *pixbuf)}, }; void jniRegisterNatives (JNIEnv *env) { int i; jint r; jclass k; for(i=0; i<((sizeof meths)/(sizeof*meths)); i++) { puts(meths[i].class); k = (*env)->FindClass (env, meths[i].class); if(k==NULL) abort(); r = (*env)->RegisterNatives (env, k, meths[i].meth, meths[i].n); //assert (r == JNI_OK); error = (*JG(jenv))->ExceptionOccurred(JG(jenv)); abort_on_error(error); } } static int jvm_create() { //JavaVMOption options[4]; JavaVMInitArgs vm_args; /* JDK 1.2 VM initialization arguments */ int rc; jobject local_php_reflect; jthrowable error; vm_args.version = JNI_VERSION_1_2; /* New in 1.1.2: VM version */ JNI_GetDefaultJavaVMInitArgs(&vm_args); /* options[0].optionString = "-Djava.compiler=NONE"; /\* disable JIT *\/ */ /* options[1].optionString = "-Djava.class.path=/home/jost/CrystalClear"; /\* user classes *\/ */ /* options[2].optionString = "-Djava.library.path=/mylibs"; /\* set native library path *\/ */ /* options[3].optionString = "-Djava.awt.headless=true"; /\* print JNI-related messages *\/ */ /* vm_args.options = options; */ /* vm_args.nOptions = 4; */ //setenv("CLASSPATH", crystalclear_classpath, 1); /* load and initialize a Java VM, return a JNI interface * pointer in env */ JNI_CreateJavaVM(&JG(jvm), &JG(jenv), &vm_args); jniRegisterNatives(JG(jenv)); return rc; } #ifdef MAIN int main(char **argv, int argc) { jvm_create(); jclass clazz = (*JG(jenv))->FindClass(JG(jenv), "Startup"); jmethodID main = (*(JG(jenv)))->GetStaticMethodID(JG(jenv), clazz, "main", "([Ljava/lang/String;)V"); (*(JG(jenv)))->CallStaticVoidMethod(JG(jenv), clazz, main, 0); jvm_destroy(); exit(0); } #endif