4 * Various JNI helper functions
6 * Copyright 2006,2007 Martin Quinson, Malek Cherier All right reserved.
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the license (GNU LGPL) which comes with this package.
13 #include <stdlib.h> /* abort */
15 #include "xbt/sysdep.h"
17 #include "jxbt_utilities.h"
23 jclass jxbt_get_class(JNIEnv * env, const char *name)
25 jclass cls = (*env)->FindClass(env, name);
28 char *m = bprintf("Class %s not found", name);
29 jxbt_throw_jni(env, m);
37 jmethodID jxbt_get_jmethod(JNIEnv * env, jclass cls,
38 const char *name, const char *signature)
44 id = (*env)->GetMethodID(env, cls, name, signature);
49 (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
51 (jstring) (*env)->CallObjectMethod(env, cls, tostr_id, NULL);
52 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
55 bprintf("Cannot find method %s(%s) in %s", name, signature, classname);
57 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
59 jxbt_throw_jni(env, m);
68 jmethodID jxbt_get_static_jmethod(JNIEnv * env, jclass cls,
69 const char *name, const char *signature)
75 id = (*env)->GetStaticMethodID(env, cls, name, signature);
80 (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
82 (jstring) (*env)->CallObjectMethod(env, cls, tostr_id, NULL);
83 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
86 bprintf("Cannot find static method %s(%s) in %s", name, signature,
89 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
91 jxbt_throw_jni(env, m);
100 jmethodID jxbt_get_static_smethod(JNIEnv * env, const char *classname,
101 const char *name, const char *signature)
107 cls = jxbt_get_class(env, classname);
112 id = (*env)->GetStaticMethodID(env, cls, name, signature);
116 bprintf("Cannot find static method %s(%s) in %s", name, signature,
119 jxbt_throw_jni(env, m);
127 jmethodID jxbt_get_smethod(JNIEnv * env, const char *classname,
128 const char *name, const char *signature)
134 cls = jxbt_get_class(env, classname);
139 id = (*env)->GetMethodID(env, cls, name, signature);
143 bprintf("Cannot find method %s(%s) in %s", name, signature, classname);
145 jxbt_throw_jni(env, m);
153 jfieldID jxbt_get_jfield(JNIEnv * env, jclass cls,
154 const char *name, const char *signature)
161 id = (*env)->GetFieldID(env, cls, name, signature);
164 jmethodID getname_id =
165 (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
167 (jstring) (*env)->CallObjectMethod(env, cls, getname_id, NULL);
168 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
170 bprintf("Cannot find field %s %s in %s", signature, name, classname);
172 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
174 jxbt_throw_jni(env, m);
183 jfieldID jxbt_get_sfield(JNIEnv * env, const char *classname,
184 const char *name, const char *signature)
186 jclass cls = jxbt_get_class(env, classname);
192 id = (*env)->GetFieldID(env, cls, name, signature);
196 bprintf("Cannot find field %s %s in %s", signature, name, classname);
198 jxbt_throw_jni(env, m);
207 /* ***************** */
208 /* EXCEPTION RAISING */
209 /* ***************** */
210 static void jxbt_throw_by_name(JNIEnv * env, const char *name, char *msg)
212 jclass cls = (*env)->FindClass(env, name);
214 xbt_assert2(cls, "%s (Plus severe error: class %s not found)\n", msg, name);
216 (*env)->ThrowNew(env, cls, msg);
223 void jxbt_throw_jni(JNIEnv * env, const char *msg)
225 jxbt_throw_by_name(env,
226 "simgrid/msg/JniException",
227 bprintf("Internal or JNI error: %s", msg));
230 void jxbt_throw_notbound(JNIEnv * env, const char *kind, void *pointer)
232 jxbt_throw_by_name(env,
233 "simgrid/msg/JniException",
234 bprintf("Internal error: %s %p not bound", kind,
238 void jxbt_throw_native(JNIEnv * env, char *msg)
240 jxbt_throw_by_name(env, "simgrid/msg/NativeException", msg);
244 void jxbt_throw_null(JNIEnv * env, char *msg)
246 jxbt_throw_by_name(env, "java/lang/NullPointerException", msg);
250 /* Errors on user side */
251 void jxbt_throw_illegal(JNIEnv * env, char *msg)
253 jxbt_throw_by_name(env, "java/lang/IllegalArgumentException", msg);
256 void jxbt_throw_host_not_found(JNIEnv * env, const char *invalid_name)
258 jxbt_throw_by_name(env,
259 "simgrid/msg/HostNotFoundException",
260 bprintf("No such host: %s", invalid_name));
263 void jxbt_throw_process_not_found(JNIEnv * env, const char *invalid_name)
265 jxbt_throw_by_name(env,
266 "simgrid/msg/ProcessNotFoundException",
267 bprintf("No such process: %s", invalid_name));