]> rtime.felk.cvut.cz Git - orte.git/blob - orte/libjorte/onLoad.c
f7b8e484e129802156fe0474b482b4f73485d4c5
[orte.git] / orte / libjorte / onLoad.c
1 #include <stdlib.h>
2 #include <jni.h>
3
4 static jmethodID findClassM;
5 static jmethodID findLoadedClassM;
6 static jobject classLoader;
7
8 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
9   JNIEnv *env;
10   jclass testCl;
11   jclass clClass;
12   jclass clClassLoader;
13   jmethodID getClassLoader;
14
15   (*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_6);
16
17   testCl = (*env)->FindClass(env, "org/ocera/orte/JOrte");
18   clClass = (*env)->FindClass(env, "java/lang/Class");
19   clClassLoader = (*env)->FindClass(env, "java/lang/ClassLoader");
20   getClassLoader = (*env)->GetMethodID(env, clClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
21   classLoader = (*env)->CallObjectMethod(env, testCl, getClassLoader);
22   classLoader = (*env)->NewGlobalRef(env, classLoader);
23   findClassM = (*env)->GetMethodID(env, clClassLoader, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
24   findLoadedClassM = (*env)->GetMethodID(env, clClassLoader, "findLoadedClass", "(Ljava/lang/String;)Ljava/lang/Class;");
25
26   return JNI_VERSION_1_6;
27 }
28
29 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) {
30   JNIEnv *env;
31
32   (*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_6);
33
34   (*env)->DeleteGlobalRef(env, classLoader);
35 }
36
37 jclass findClass(JNIEnv *env, const char* name) {
38   jclass cl;
39
40   if ((cl = (*env)->CallObjectMethod(env, classLoader, findLoadedClassM, (*env)->NewStringUTF(env, name))) == NULL) {
41     cl = (*env)->CallObjectMethod(env, classLoader, findClassM, (*env)->NewStringUTF(env, name));
42   }
43
44   return cl;
45 }