91 lines
1.7 KiB
C
91 lines
1.7 KiB
C
|
#include <assert.h>
|
||
|
#include <jni.h>
|
||
|
#include <alloca.h>
|
||
|
|
||
|
#include <pthread.h>
|
||
|
|
||
|
union env_union
|
||
|
{
|
||
|
void *void_env;
|
||
|
JNIEnv *jni_env;
|
||
|
};
|
||
|
|
||
|
union env_union tmp;
|
||
|
JNIEnv* env;
|
||
|
JavaVM* jvm;
|
||
|
JavaVMInitArgs vm_args;
|
||
|
JavaVMOption options[1];
|
||
|
jclass class_id;
|
||
|
jmethodID method_id;
|
||
|
jint result;
|
||
|
|
||
|
long product(unsigned long n, unsigned long m) {
|
||
|
if (m == 1) {
|
||
|
return n;
|
||
|
} else {
|
||
|
int *p = alloca(sizeof (int));
|
||
|
*p = n;
|
||
|
return product (n, m-1) + *p;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void *
|
||
|
floobydust (void *p)
|
||
|
{
|
||
|
(*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
|
||
|
env = tmp.jni_env;
|
||
|
|
||
|
class_id = (*env)->FindClass (env, "T");
|
||
|
assert (class_id);
|
||
|
|
||
|
method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
|
||
|
assert (method_id);
|
||
|
|
||
|
(*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
|
||
|
|
||
|
(*jvm)->DetachCurrentThread(jvm);
|
||
|
|
||
|
printf("%ld\n", product(5000,5000));
|
||
|
|
||
|
(*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
|
||
|
env = tmp.jni_env;
|
||
|
|
||
|
class_id = (*env)->FindClass (env, "T");
|
||
|
assert (class_id);
|
||
|
|
||
|
method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
|
||
|
assert (method_id);
|
||
|
|
||
|
(*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
|
||
|
|
||
|
(*jvm)->DetachCurrentThread(jvm);
|
||
|
|
||
|
printf("%ld\n", product(5000,5000));
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main (int argc, const char** argv)
|
||
|
{
|
||
|
options[0].optionString = "-Xss320k";
|
||
|
|
||
|
vm_args.version = JNI_VERSION_1_2;
|
||
|
vm_args.ignoreUnrecognized = JNI_TRUE;
|
||
|
vm_args.options = options;
|
||
|
vm_args.nOptions = 1;
|
||
|
|
||
|
result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
|
||
|
assert (result >= 0);
|
||
|
|
||
|
env = tmp.jni_env;
|
||
|
|
||
|
floobydust (NULL);
|
||
|
|
||
|
pthread_t thr;
|
||
|
pthread_create (&thr, NULL, floobydust, NULL);
|
||
|
pthread_join (thr, NULL);
|
||
|
|
||
|
return 0;
|
||
|
}
|