#include <stdlib.h>
#include <string.h>
#include <jni.h>
#include <pthread.h>
JavaVM *jvm;
void jvm_init()
{
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
int nbOptions;
jint res;
char classPath[128], libraryPath[128];
strcpy(classPath, "-Djava.class.path=/usr/share/java:/root/java32/mysql-connector-java.jar:/root/java32"); /* Path of the SwingManu.class file */
strcpy(libraryPath, "-Djava.library.path=/root/java32:/usr/lib/jvm/java-6-openjdk/jre/lib/amd64"); /* Path of the libNativeMethods.so library */
nbOptions=0;
options[0].optionString = classPath; nbOptions++;
options[1].optionString = libraryPath; nbOptions++;
vm_args.version = JNI_VERSION_1_2; /* Specifies the JNI version used */
vm_args.options = options;
vm_args.nOptions = nbOptions;
vm_args.ignoreUnrecognized = JNI_TRUE; /* JNI won't complain about unrecognized options */
res = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args);
#if 0
int ret;
ret = (*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL);
if (ret != JNI_OK)
printf("[ERROR] MAIN AttachCurrentThread() != JNI_OK\n");
#endif
}
void *thread_worker(void *data)
{
int ret;
JNIEnv *env;
ret = (*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL);
if (ret != JNI_OK)
printf("[ERROR] AttachCurrentThread() != JNI_OK\n");
#if 0
jobject lock; // THIS ISNT WORKING, WHERE SHALL I GET AN OBJECT AS LOCK?
ret = (*env)->MonitorEnter(env, lock);
if (ret != JNI_OK)
printf("[ERROR] MonitorEnter() != JNI_OK\n");
#endif
jclass helloWorldClass;
jmethodID mainMethod;
jobjectArray applicationArgs;
jstring applicationArg0;
helloWorldClass = (*env)->FindClass(env, "Quadrat");
mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/String;)V");
applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "java/lang/String"), NULL);
applicationArg0 = (*env)->NewStringUTF(env, "From-C-program"); // TOOOOOOOOOODOOOOOOOO: free?
(*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0);
(*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, applicationArgs);
#if 0
ret = (*env)->MonitorExit(env, lock);
if (ret != JNI_OK)
printf("[ERROR] MonitorExit() != JNI_OK\n");
#endif
ret = (*jvm)->DetachCurrentThread(jvm);
if (ret != JNI_OK)
printf("[ERROR] DetachCurrentThread() != JNI_OK\n");
}
int main (int argc, char *argv[])
{
jvm_init();
// just for testing
thread_worker(NULL);
thread_worker(NULL);
thread_worker(NULL);
int i;
for (i=0; i<200; i++)
{
pthread_t thread;
pthread_create(&thread, NULL, thread_worker, NULL);
usleep(1000 * 20); // immediatly = many jvm errors
}
usleep(1000*1000 * 10); // wait 10 seconds for end of all threads
printf("\n");
}