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) {
24 jclass cls = (*env)->FindClass(env, name);
27 char *m=bprintf("Class %s not found",name);
28 jxbt_throw_jni(env, m);
36 jmethodID jxbt_get_jmethod(JNIEnv* env, jclass cls,
37 const char *name,const char *signature) {
42 id = (*env)->GetMethodID(env, cls, name,signature);
46 jmethodID tostr_id = (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
47 jstring jclassname = (jstring) (*env)->CallObjectMethod(env, cls, tostr_id, NULL);
48 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
50 char *m=bprintf("Cannot find method %s(%s) in %s", name, signature ,classname);
52 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
54 jxbt_throw_jni(env,m);
63 jmethodID jxbt_get_static_jmethod(JNIEnv* env, jclass cls,
64 const char *name,const char *signature) {
69 id = (*env)->GetStaticMethodID(env, cls, name,signature);
73 jmethodID tostr_id = (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
74 jstring jclassname = (jstring) (*env)->CallObjectMethod(env, cls, tostr_id, NULL);
75 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
77 char *m=bprintf("Cannot find static method %s(%s) in %s", name, signature ,classname);
79 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
81 jxbt_throw_jni(env,m);
90 jmethodID jxbt_get_static_smethod(JNIEnv* env, const char *classname,
91 const char *name,const char *signature) {
96 cls = jxbt_get_class(env,classname);
101 id = (*env)->GetStaticMethodID(env, cls, name,signature);
104 char *m=bprintf("Cannot find static method %s(%s) in %s", name, signature,classname);
106 jxbt_throw_jni(env,m);
114 jmethodID jxbt_get_smethod(JNIEnv* env, const char *classname,
115 const char *name,const char *signature) {
120 cls = jxbt_get_class(env,classname);
125 id = (*env)->GetMethodID(env, cls, name,signature);
128 char *m=bprintf("Cannot find method %s(%s) in %s", name, signature,classname);
130 jxbt_throw_jni(env,m);
138 jfieldID jxbt_get_jfield(JNIEnv* env, jclass cls,
139 const char *name, const char *signature) {
145 id = (*env)->GetFieldID(env, cls, name, signature);
148 jmethodID getname_id = (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
149 jstring jclassname = (jstring) (*env)->CallObjectMethod(env,cls, getname_id, NULL);
150 const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
151 char *m=bprintf("Cannot find field %s %s in %s",signature, name, classname);
153 (*env)->ReleaseStringUTFChars(env, jclassname, classname);
155 jxbt_throw_jni(env,m);
164 jfieldID jxbt_get_sfield(JNIEnv* env, const char *classname,
165 const char *name, const char *signature) {
166 jclass cls = jxbt_get_class(env,classname);
172 id = (*env)->GetFieldID(env, cls, name, signature);
175 char *m=bprintf("Cannot find field %s %s in %s",signature, name, classname);
177 jxbt_throw_jni(env,m);
186 /* ***************** */
187 /* EXCEPTION RAISING */
188 /* ***************** */
189 static void jxbt_throw_by_name(JNIEnv* env,const char* name, char *msg) {
190 jclass cls = (*env)->FindClass(env, name);
192 xbt_assert2(cls,"%s (Plus severe error: class %s not found)\n",
195 (*env)->ThrowNew(env,cls,msg);
202 void jxbt_throw_jni(JNIEnv* env,const char* msg) {
203 jxbt_throw_by_name(env,
204 "simgrid/msg/JniException",
205 bprintf("Internal or JNI error: %s",msg));
207 void jxbt_throw_notbound(JNIEnv* env,const char* kind, void *pointer) {
208 jxbt_throw_by_name(env,
209 "simgrid/msg/JniException",
210 bprintf("Internal error: %s %p not bound",kind, pointer));
213 void jxbt_throw_native(JNIEnv* env,char* msg) {
214 jxbt_throw_by_name(env, "simgrid/msg/NativeException", msg);
218 void jxbt_throw_null(JNIEnv* env, char* msg) {
219 jxbt_throw_by_name(env, "java/lang/NullPointerException", msg);
223 /* Errors on user side */
224 void jxbt_throw_illegal(JNIEnv* env, char* msg) {
225 jxbt_throw_by_name(env, "java/lang/IllegalArgumentException", msg);
227 void jxbt_throw_host_not_found(JNIEnv* env, const char *invalid_name) {
228 jxbt_throw_by_name(env,
229 "simgrid/msg/HostNotFoundException",
230 bprintf("No such host: %s",invalid_name));
232 void jxbt_throw_process_not_found(JNIEnv* env, const char *invalid_name) {
233 jxbt_throw_by_name(env,
234 "simgrid/msg/ProcessNotFoundException",
235 bprintf("No such process: %s",invalid_name));