1 /* Various JNI helper functions */
3 /* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
4 * All rights reserved. */
6 /* This program is free software; you can redistribute it and/or modify it
7 * under the terms of the license (GNU LGPL) which comes with this package. */
9 #include <stdlib.h> /* abort */
11 #include "xbt/sysdep.h"
13 #include "jxbt_utilities.h"
19 jclass jxbt_get_class(JNIEnv * env, const char *name)
21 jclass cls = (*env)->FindClass(env, name);
24 char *m = bprintf("Class %s not found", name);
25 jxbt_throw_jni(env, m);
33 jmethodID jxbt_get_jmethod(JNIEnv * env, jclass cls,
34 const char *name, const char *signature)
40 id = (*env)->GetMethodID(env, cls, name, signature);
45 (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
47 (jstring) (*env)->CallObjectMethod(env, cls, tostr_id, NULL);
48 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
51 bprintf("Cannot find method %s(%s) in %s", name, signature, classname);
53 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
55 jxbt_throw_jni(env, m);
64 jmethodID jxbt_get_static_jmethod(JNIEnv * env, jclass cls,
65 const char *name, const char *signature)
71 id = (*env)->GetStaticMethodID(env, cls, name, signature);
76 (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
78 (jstring) (*env)->CallObjectMethod(env, cls, tostr_id, NULL);
79 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
82 bprintf("Cannot find static method %s(%s) in %s", name, signature,
85 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
87 jxbt_throw_jni(env, m);
96 jmethodID jxbt_get_static_smethod(JNIEnv * env, const char *classname,
97 const char *name, const char *signature)
102 cls = jxbt_get_class(env, classname);
107 id = (*env)->GetStaticMethodID(env, cls, name, signature);
111 bprintf("Cannot find static method %s(%s) in %s", name, signature,
114 jxbt_throw_jni(env, m);
122 jmethodID jxbt_get_smethod(JNIEnv * env, const char *classname,
123 const char *name, const char *signature)
128 cls = jxbt_get_class(env, classname);
133 id = (*env)->GetMethodID(env, cls, name, signature);
137 bprintf("Cannot find method %s(%s) in %s", name, signature, classname);
139 jxbt_throw_jni(env, m);
147 jfieldID jxbt_get_jfield(JNIEnv * env, jclass cls,
148 const char *name, const char *signature)
155 id = (*env)->GetFieldID(env, cls, name, signature);
158 jmethodID getname_id =
159 (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
161 (jstring) (*env)->CallObjectMethod(env, cls, getname_id, NULL);
162 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
164 bprintf("Cannot find field %s %s in %s", signature, name, classname);
166 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
168 jxbt_throw_jni(env, m);
177 jfieldID jxbt_get_sfield(JNIEnv * env, const char *classname,
178 const char *name, const char *signature)
180 jclass cls = jxbt_get_class(env, classname);
186 id = (*env)->GetFieldID(env, cls, name, signature);
190 bprintf("Cannot find field %s %s in %s", signature, name, classname);
192 jxbt_throw_jni(env, m);
201 /* ***************** */
202 /* EXCEPTION RAISING */
203 /* ***************** */
204 static void jxbt_throw_by_name(JNIEnv * env, const char *name, char *msg)
206 jclass cls = (*env)->FindClass(env, name);
208 xbt_assert2(cls, "%s (Plus severe error: class %s not found)\n", msg, name);
210 (*env)->ThrowNew(env, cls, msg);
217 void jxbt_throw_jni(JNIEnv * env, const char *msg)
219 jxbt_throw_by_name(env,
220 "simgrid/msg/JniException",
221 bprintf("Internal or JNI error: %s", msg));
224 void jxbt_throw_notbound(JNIEnv * env, const char *kind, void *pointer)
226 jxbt_throw_by_name(env,
227 "simgrid/msg/JniException",
228 bprintf("Internal error: %s %p not bound", kind,
232 void jxbt_throw_native(JNIEnv * env, char *msg)
234 jxbt_throw_by_name(env, "simgrid/msg/NativeException", msg);
238 void jxbt_throw_null(JNIEnv * env, char *msg)
240 jxbt_throw_by_name(env, "java/lang/NullPointerException", msg);
243 /* Errors on user side */
244 void jxbt_throw_illegal(JNIEnv * env, char *msg)
246 jxbt_throw_by_name(env, "java/lang/IllegalArgumentException", msg);
249 void jxbt_throw_host_not_found(JNIEnv * env, const char *invalid_name)
251 jxbt_throw_by_name(env,
252 "simgrid/msg/HostNotFoundException",
253 bprintf("No such host: %s", invalid_name));
256 void jxbt_throw_process_not_found(JNIEnv * env, const char *invalid_name)
258 jxbt_throw_by_name(env,
259 "simgrid/msg/ProcessNotFoundException",
260 bprintf("No such process: %s", invalid_name));
264 void jxbt_throw_transfer_failure(JNIEnv *env,char *details) {
266 jxbt_throw_by_name(env,
267 "simgrid/msg/TransferFailureException",
272 // host failure Exception
273 void jxbt_throw_host_failure(JNIEnv *env,char *details) {
275 jxbt_throw_by_name(env,
276 "simgrid/msg/HostFailureException",
277 bprintf("Host Failure %s",details));
281 // time out failure Exception
282 void jxbt_throw_time_out_failure(JNIEnv *env,char *details) {
284 jxbt_throw_by_name(env,
285 "simgrid/msg/TimeoutException",
290 // task Cancelled exception
291 void jxbt_throw_task_cancelled(JNIEnv *env,char *details)
294 jxbt_throw_by_name(env,
295 "simgrid/msg/TaskCancelledException",