1 #include <assert.h>
   2 #include <jni.h>
   3 #include <alloca.h>
   4 
   5 #include <pthread.h>
   6 
   7 union env_union
   8 {
   9   void *void_env;
  10   JNIEnv *jni_env;
  11 };
  12 
  13 union env_union tmp;
  14 JNIEnv* env;
  15 JavaVM* jvm;
  16 JavaVMInitArgs vm_args;
  17 JavaVMOption options[1];
  18 jclass class_id;
  19 jmethodID method_id;
  20 jint result;
  21 
  22 long product(unsigned long n, unsigned long m) {
  23     if (m == 1) {
  24       return n;
  25     } else {
  26       int *p = alloca(sizeof (int));
  27       *p = n;
  28       return product (n, m-1) + *p;
  29     }
  30 }
  31 
  32 void *
  33 floobydust (void *p)
  34 {
  35   (*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
  36   env = tmp.jni_env;
  37 
  38   class_id = (*env)->FindClass (env, "T");
  39   assert (class_id);
  40 
  41   method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
  42   assert (method_id);
  43 
  44   (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
  45 
  46   (*jvm)->DetachCurrentThread(jvm);
  47 
  48   printf("%ld\n", product(5000,5000));
  49 
  50   (*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
  51   env = tmp.jni_env;
  52 
  53   class_id = (*env)->FindClass (env, "T");
  54   assert (class_id);
  55 
  56   method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
  57   assert (method_id);
  58 
  59   (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
  60 
  61   (*jvm)->DetachCurrentThread(jvm);
  62 
  63   printf("%ld\n", product(5000,5000));
  64 
  65   return NULL;
  66 }
  67 
  68 int
  69 main (int argc, const char** argv)
  70 {
  71   options[0].optionString = "-Xss320k";
  72 
  73   vm_args.version = JNI_VERSION_1_2;
  74   vm_args.ignoreUnrecognized = JNI_TRUE;
  75   vm_args.options = options;
  76   vm_args.nOptions = 1;
  77 
  78   result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
  79   assert (result >= 0);
  80 
  81   env = tmp.jni_env;
  82 
  83   floobydust (NULL);
  84 
  85   pthread_t thr;
  86   pthread_create (&thr, NULL, floobydust, NULL);
  87   pthread_join (thr, NULL);
  88 
  89   return 0;
  90 }