1 /* Various JNI helper functions */
3 /* Copyright (c) 2007-2014. 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"
15 jclass jxbt_get_class(JNIEnv * env, const char *name)
17 jclass cls = env->FindClass(name);
20 char *m = bprintf("Class %s not found", name);
21 jxbt_throw_jni(env, m);
29 jmethodID jxbt_get_jmethod(JNIEnv * env, jclass cls, const char *name, const char *signature)
35 id = env->GetMethodID(cls, name, signature);
39 jmethodID tostr_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
40 jstring jclassname = (jstring) env->CallObjectMethod(cls, tostr_id, nullptr);
41 const char *classname = env->GetStringUTFChars(jclassname, 0);
43 char *m = bprintf("Cannot find method %s(%s) in %s", name, signature, classname);
45 env->ReleaseStringUTFChars(jclassname, classname);
47 jxbt_throw_jni(env, m);
56 jmethodID jxbt_get_static_jmethod(JNIEnv * env, jclass cls, const char *name, const char *signature)
62 id = env->GetStaticMethodID(cls, name, signature);
65 jmethodID tostr_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
66 jstring jclassname = (jstring) env->CallObjectMethod(cls, tostr_id, nullptr);
67 const char *classname = env->GetStringUTFChars(jclassname, 0);
69 char *m = bprintf("Cannot find static method %s(%s) in %s", name, signature, classname);
71 env->ReleaseStringUTFChars(jclassname, classname);
73 jxbt_throw_jni(env, m);
82 jmethodID jxbt_get_static_smethod(JNIEnv * env, const char *classname, const char *name, const char *signature)
86 cls = jxbt_get_class(env, classname);
91 id = env->GetStaticMethodID(cls, name, signature);
94 char *m = bprintf("Cannot find static method %s(%s) in %s", name, signature, classname);
96 jxbt_throw_jni(env, m);
104 jmethodID jxbt_get_smethod(JNIEnv * env, const char *classname, const char *name, const char *signature)
108 cls = jxbt_get_class(env, classname);
113 id = env->GetMethodID(cls, name, signature);
116 char *m = bprintf("Cannot find method %s(%s) in %s", name, signature, classname);
118 jxbt_throw_jni(env, m);
126 jfieldID jxbt_get_jfield(JNIEnv * env, jclass cls, const char *name, const char *signature)
133 id = env->GetFieldID(cls, name, signature);
136 jmethodID getname_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
137 jstring jclassname = (jstring) env->CallObjectMethod(cls, getname_id, nullptr);
138 const char *classname = env->GetStringUTFChars(jclassname, 0);
139 char *m = bprintf("Cannot find field %s %s in %s", signature, name, classname);
141 env->ReleaseStringUTFChars(jclassname, classname);
143 jxbt_throw_jni(env, m);
152 jfieldID jxbt_get_sfield(JNIEnv * env, const char *classname, const char *name, const char *signature)
154 jclass cls = jxbt_get_class(env, classname);
160 id = env->GetFieldID(cls, name, signature);
163 char *m = bprintf("Cannot find field %s %s in %s", signature, name, classname);
165 jxbt_throw_jni(env, m);
174 void jxbt_throw_by_name(JNIEnv * env, const char *name, char *msg)
176 jclass cls = env->FindClass(name);
178 xbt_assert(cls, "%s (Plus severe error: class %s not found)\n", msg, name);
180 env->ThrowNew(cls, msg);
185 void jxbt_throw_jni(JNIEnv * env, const char *msg)
187 jxbt_throw_by_name(env, "org/simgrid/msg/JniException", bprintf("Internal or JNI error: %s", msg));
190 void jxbt_throw_notbound(JNIEnv * env, const char *kind, void *pointer)
192 jxbt_throw_by_name(env, "org/simgrid/msg/JniException", bprintf("Internal error: %s %p not bound", kind, pointer));
195 void jxbt_throw_null(JNIEnv * env, char *msg)
197 jxbt_throw_by_name(env, "java/lang/NullPointerException", msg);
200 void jxbt_throw_illegal(JNIEnv * env, char *msg)
202 jxbt_throw_by_name(env, "java/lang/IllegalArgumentException", msg);
205 void jxbt_throw_host_not_found(JNIEnv * env, const char *invalid_name)
207 jxbt_throw_by_name(env, "org/simgrid/msg/HostNotFoundException", bprintf("No such host: %s", invalid_name));
210 void jxbt_throw_storage_not_found(JNIEnv * env, const char *invalid_name)
212 jxbt_throw_by_name(env, "org/simgrid/msg/StorageNotFoundException", bprintf("No such storage: %s", invalid_name));
215 void jxbt_throw_process_not_found(JNIEnv * env, const char *invalid_name)
217 jxbt_throw_by_name(env, "org/simgrid/msg/ProcessNotFoundException", bprintf("No such process: %s", invalid_name));
220 void jxbt_throw_transfer_failure(JNIEnv * env, char *details)
222 jxbt_throw_by_name(env, "org/simgrid/msg/TransferFailureException", details);
225 void jxbt_throw_host_failure(JNIEnv * env, char *details)
227 jxbt_throw_by_name(env, "org/simgrid/msg/HostFailureException", bprintf("Host Failure %s", details));
230 void jxbt_throw_time_out_failure(JNIEnv * env, char *details)
232 jxbt_throw_by_name(env, "org/simgrid/msg/TimeoutException", details);
235 void jxbt_throw_task_cancelled(JNIEnv * env, char *details)
237 jxbt_throw_by_name(env, "org/simgrid/msg/TaskCancelledException", details);