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"
17 jclass jxbt_get_class(JNIEnv * env, const char *name)
19 jclass cls = env->FindClass(name);
22 char *m = bprintf("Class %s not found", name);
23 jxbt_throw_jni(env, m);
31 jmethodID jxbt_get_jmethod(JNIEnv * env, jclass cls, const char *name, const char *signature)
37 id = env->GetMethodID(cls, name, signature);
41 jmethodID tostr_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
42 jstring jclassname = (jstring) env->CallObjectMethod(cls, tostr_id, nullptr);
43 const char *classname = env->GetStringUTFChars(jclassname, 0);
45 char *m = bprintf("Cannot find method %s(%s) in %s", name, signature, classname);
47 env->ReleaseStringUTFChars(jclassname, classname);
49 jxbt_throw_jni(env, m);
58 jmethodID jxbt_get_static_jmethod(JNIEnv * env, jclass cls, const char *name, const char *signature)
64 id = env->GetStaticMethodID(cls, name, signature);
67 jmethodID tostr_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
68 jstring jclassname = (jstring) env->CallObjectMethod(cls, tostr_id, nullptr);
69 const char *classname = env->GetStringUTFChars(jclassname, 0);
71 char *m = bprintf("Cannot find static method %s(%s) in %s", name, signature, classname);
73 env->ReleaseStringUTFChars(jclassname, classname);
75 jxbt_throw_jni(env, m);
84 jmethodID jxbt_get_static_smethod(JNIEnv * env, const char *classname, const char *name, const char *signature)
88 cls = jxbt_get_class(env, classname);
93 id = env->GetStaticMethodID(cls, name, signature);
96 char *m = bprintf("Cannot find static method %s(%s) in %s", name, signature, classname);
98 jxbt_throw_jni(env, m);
106 jmethodID jxbt_get_smethod(JNIEnv * env, const char *classname, const char *name, const char *signature)
110 cls = jxbt_get_class(env, classname);
115 id = env->GetMethodID(cls, name, signature);
118 char *m = bprintf("Cannot find method %s(%s) in %s", name, signature, classname);
120 jxbt_throw_jni(env, m);
128 jfieldID jxbt_get_jfield(JNIEnv * env, jclass cls, const char *name, const char *signature)
135 id = env->GetFieldID(cls, name, signature);
138 jmethodID getname_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
139 jstring jclassname = (jstring) env->CallObjectMethod(cls, getname_id, nullptr);
140 const char *classname = env->GetStringUTFChars(jclassname, 0);
141 char *m = bprintf("Cannot find field %s %s in %s", signature, name, classname);
143 env->ReleaseStringUTFChars(jclassname, classname);
145 jxbt_throw_jni(env, m);
154 jfieldID jxbt_get_sfield(JNIEnv * env, const char *classname, const char *name, const char *signature)
156 jclass cls = jxbt_get_class(env, classname);
162 id = env->GetFieldID(cls, name, signature);
165 char *m = bprintf("Cannot find field %s %s in %s", signature, name, classname);
167 jxbt_throw_jni(env, m);
176 void jxbt_throw_by_name(JNIEnv * env, const char *name, char *msg)
178 jclass cls = env->FindClass(name);
180 xbt_assert(cls, "%s (Plus severe error: class %s not found)\n", msg, name);
182 env->ThrowNew(cls, msg);
187 void jxbt_throw_jni(JNIEnv * env, const char *msg)
189 jxbt_throw_by_name(env, "org/simgrid/msg/JniException", bprintf("Internal or JNI error: %s", msg));
192 void jxbt_throw_notbound(JNIEnv * env, const char *kind, void *pointer)
194 jxbt_throw_by_name(env, "org/simgrid/msg/JniException", bprintf("Internal error: %s %p not bound", kind, pointer));
197 void jxbt_throw_null(JNIEnv * env, char *msg)
199 jxbt_throw_by_name(env, "java/lang/NullPointerException", msg);
202 void jxbt_throw_illegal(JNIEnv * env, char *msg)
204 jxbt_throw_by_name(env, "java/lang/IllegalArgumentException", msg);
207 void jxbt_throw_host_not_found(JNIEnv * env, const char *invalid_name)
209 jxbt_throw_by_name(env, "org/simgrid/msg/HostNotFoundException", bprintf("No such host: %s", invalid_name));
212 void jxbt_throw_storage_not_found(JNIEnv * env, const char *invalid_name)
214 jxbt_throw_by_name(env, "org/simgrid/msg/StorageNotFoundException", bprintf("No such storage: %s", invalid_name));
217 void jxbt_throw_process_not_found(JNIEnv * env, const char *invalid_name)
219 jxbt_throw_by_name(env, "org/simgrid/msg/ProcessNotFoundException", bprintf("No such process: %s", invalid_name));
222 void jxbt_throw_transfer_failure(JNIEnv * env, char *details)
224 jxbt_throw_by_name(env, "org/simgrid/msg/TransferFailureException", details);
227 void jxbt_throw_host_failure(JNIEnv * env, char *details)
229 jxbt_throw_by_name(env, "org/simgrid/msg/HostFailureException", bprintf("Host Failure %s", details));
232 void jxbt_throw_time_out_failure(JNIEnv * env, char *details)
234 jxbt_throw_by_name(env, "org/simgrid/msg/TimeoutException", details);
237 void jxbt_throw_task_cancelled(JNIEnv * env, char *details)
239 jxbt_throw_by_name(env, "org/simgrid/msg/TaskCancelledException", details);