1320N/A#include <assert.h>
1320N/A#include <jni.h>
1320N/A#include <alloca.h>
1320N/A
1320N/A#include <pthread.h>
1320N/A
1320N/Aunion env_union
1320N/A{
1320N/A void *void_env;
1320N/A JNIEnv *jni_env;
1320N/A};
1320N/A
1320N/Aunion env_union tmp;
1320N/AJNIEnv* env;
1320N/AJavaVM* jvm;
1320N/AJavaVMInitArgs vm_args;
1320N/AJavaVMOption options[1];
1320N/Ajclass class_id;
1320N/AjmethodID method_id;
1320N/Ajint result;
1320N/A
1320N/Along product(unsigned long n, unsigned long m) {
1320N/A if (m == 1) {
1320N/A return n;
1320N/A } else {
1320N/A int *p = alloca(sizeof (int));
1320N/A *p = n;
1320N/A return product (n, m-1) + *p;
1320N/A }
1320N/A}
1320N/A
1320N/Avoid *
1320N/Afloobydust (void *p)
1320N/A{
1320N/A (*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
1320N/A env = tmp.jni_env;
1320N/A
1320N/A class_id = (*env)->FindClass (env, "T");
1320N/A assert (class_id);
1320N/A
1320N/A method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
1320N/A assert (method_id);
1320N/A
1320N/A (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
1320N/A
1320N/A (*jvm)->DetachCurrentThread(jvm);
1320N/A
1320N/A printf("%ld\n", product(5000,5000));
1320N/A
1320N/A (*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
1320N/A env = tmp.jni_env;
1320N/A
1320N/A class_id = (*env)->FindClass (env, "T");
1320N/A assert (class_id);
1320N/A
1320N/A method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
1320N/A assert (method_id);
1320N/A
1320N/A (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
1320N/A
1320N/A (*jvm)->DetachCurrentThread(jvm);
1320N/A
1320N/A printf("%ld\n", product(5000,5000));
1320N/A
1320N/A return NULL;
1320N/A}
1320N/A
1320N/Aint
1320N/Amain (int argc, const char** argv)
1320N/A{
1320N/A options[0].optionString = "-Xss320k";
1320N/A
1320N/A vm_args.version = JNI_VERSION_1_2;
1320N/A vm_args.ignoreUnrecognized = JNI_TRUE;
1320N/A vm_args.options = options;
1320N/A vm_args.nOptions = 1;
1320N/A
1320N/A result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
1320N/A assert (result >= 0);
1320N/A
1320N/A env = tmp.jni_env;
1320N/A
1320N/A floobydust (NULL);
1320N/A
1320N/A pthread_t thr;
1320N/A pthread_create (&thr, NULL, floobydust, NULL);
1320N/A pthread_join (thr, NULL);
1320N/A
1320N/A return 0;
1320N/A}