00001
00023 #include <jni.h>
00024 #include "gridlabd.h"
00025
00026 #ifndef _GRIDLABD_JAVA_H_
00027 #define _GRIDLABD_JAVA_H_
00028
00029 typedef struct s_javacallbacks {
00030 JavaVM *(*get_jvm)();
00031 JNIEnv *(*get_env)();
00032 void *(*set_obj)(jobject, OBJECT *, void *, int);
00033 } JAVACALLBACKS;
00034
00035 CDECL JavaVM *get_jvm();
00036 CDECL JNIEnv *get_env();
00037 CDECL void *set_obj(jobject obj, OBJECT * object_addr, void *block_addr, int id);
00038 EXPORT void *getvar(char *varname, char *value, unsigned int size);
00039
00040 char *get_classpath();
00041 char *get_libpath();
00042 void *get_jcb();
00043
00044 #define jgl_get_jvm (*jcallback->get_jvm)
00045 #define jgl_get_env (*jcallback->get_env)
00046 #define jgl_set_obj (*jcallback->set_obj)
00047
00048 #ifdef JDLMAIN
00049 #define EXTERN
00050 #define INIT(X) =(X)
00051 #else
00052 #ifdef __cplusplus
00053 #define EXTERN
00054 #else
00055 #define EXTERN extern
00056 #endif
00057 #define INIT(X)
00058 #endif
00059 CDECL EXPORT EXTERN JAVACALLBACKS *jcallback INIT(NULL);
00060 #undef INIT
00061 #undef EXTERN
00062
00063 #define EXPORT_JAVA_CREATE(name) EXPORT_JAVA_CREATE_EX(name, name)
00064 #define EXPORT_JAVA_CREATE_EX(N, C) \
00065 \
00066 CLASS *N##_class=NULL; \
00067 OBJECT *last_##N=NULL; \
00068 \
00069 EXPORT int create_##N(OBJECT **obj, OBJECT *parent){ \
00070 JNIEnv *jnienv = jgl_get_env(); \
00071 jclass cls = jnienv->FindClass(#N); \
00072 if(cls == NULL){ \
00073 gl_error("create_%s: unable to find %s.class", #N, #N); \
00074 return 0; \
00075 } \
00076 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "create", "(J)J"); \
00077 if(cfunc == NULL){ \
00078 gl_error("create_%s: unable to find long %s.create(long)", #N, #N); \
00079 return 0; \
00080 } \
00081 int64 rv = jnienv->CallStaticLongMethod(cls, cfunc, (int64)parent); \
00082 if(rv == 0){ \
00083 gl_error("create_%s: %s.create() failed", #N, #N); \
00084 GL_THROW("%s.create() failed", #N); \
00085 } \
00086 if (jnienv->ExceptionOccurred()) { \
00087 jnienv->ExceptionDescribe(); \
00088 } \
00089 *obj = (OBJECT *)rv; \
00090 last_##N = *obj; \
00091 gl_set_parent(*obj, parent); \
00092 return 1; \
00093 } \
00094
00095 #define EXPORT_JAVA_SYNC(name) EXPORT_JAVA_SYNC_EX(name,name)
00096 #define EXPORT_JAVA_SYNC_EX(name, classname) \
00097 EXPORT TIMESTAMP sync_##name(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass){ \
00098 JNIEnv *jnienv = jgl_get_env(); \
00099 jclass cls = jnienv->FindClass(#name); \
00100 if(cls == NULL){ \
00101 gl_error("sync_%s: unable to find %s.class", #name, #name); \
00102 return 0; \
00103 } \
00104 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "sync", "(JJI)J"); \
00105 if(cfunc == NULL){ \
00106 gl_error("sync_%s: unable to find long %s.sync(long, long, int)", #name, #name);\
00107 return 0; \
00108 } \
00109 int64 t1 = jnienv->CallStaticLongMethod(cls, cfunc, (int64)obj, t0, pass); \
00110 if (pass==PC_POSTTOPDOWN) obj->clock = t0; \
00111 return t1; \
00112 }
00113
00114 #define EXPORT_JAVA_INIT(name) \
00115 EXPORT int init_##name(OBJECT *obj, OBJECT *parent){ \
00116 JNIEnv *jnienv = jgl_get_env(); \
00117 jclass cls = jnienv->FindClass(#name); \
00118 if(cls == NULL){ \
00119 gl_error("init_%s: unable to find %s.class", #name, #name); \
00120 return 0; \
00121 } \
00122 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "init", "(JJ)I"); \
00123 if(cfunc == NULL){ \
00124 gl_error("init_%s: unable to find int %s.init(long, long)", #name, #name); \
00125 return 0; \
00126 } \
00127 int rv = jnienv->CallStaticIntMethod(cls, cfunc, (int64)obj, (int64)parent); \
00128 return rv; \
00129 }
00130
00131 #define EXPORT_JAVA_PLC(name) \
00132 EXPORT int64 plc_##name(OBJECT *obj, TIMESTAMP t0){ \
00133 JNIEnv *jnienv = jgl_get_env(); \
00134 jclass cls = jnienv->FindClass(#name); \
00135 if(cls == NULL){ \
00136 gl_error("plc_%s: unable to find %s.class", #name, #name); \
00137 return 0; \
00138 } \
00139 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "plc", "(JJ)J"); \
00140 if(cfunc == NULL){ \
00141 gl_error("init_%s: unable to find long %s.plc(long, long)", #name, #name); \
00142 return 0; \
00143 } \
00144 int64 rv = jnienv->CallStaticLongMethod(cls, cfunc, (int64)obj, t0); \
00145 return rv; \
00146 }
00147
00148 EXPORT jint JNICALL Java_GridlabD_verbose(JNIEnv *env, jclass _this, jstring str);
00149 EXPORT jint JNICALL Java_GridlabD_output(JNIEnv *, jclass, jstring);
00150 EXPORT jint JNICALL Java_GridlabD_warning(JNIEnv *env, jobject _this, jstring str);
00151 EXPORT jint JNICALL Java_GridlabD_error(JNIEnv *env, jobject _this, jstring str);
00152 EXPORT jint JNICALL Java_GridlabD_debug(JNIEnv *env, jobject _this, jstring str);
00153 EXPORT jint JNICALL Java_GridlabD_testmsg(JNIEnv *env, jobject _this, jstring str);
00154 EXPORT jlong JNICALL Java_GridlabD_get_1module_1var(JNIEnv *env, jobject _this, jstring modulename, jstring varname);
00155 EXPORT jstring JNICALL Java_GridlabD_findfile(JNIEnv *env, jobject _this, jstring filename);
00156 EXPORT jlong JNICALL Java_GridlabD_find_1module(JNIEnv *env, jobject _this, jstring modulename);
00157 EXPORT jlong JNICALL Java_GridlabD_register_1class(JNIEnv *env, jobject _this, jlong moduleaddr, jstring classname, jint passconfig);
00158 EXPORT jlong JNICALL Java_GridlabD_create_1object(JNIEnv *env, jobject _this, jlong oclass_addr, jlong size);
00159 EXPORT jlong JNICALL Java_GridlabD_create_1array(JNIEnv *env, jobject _this, jlong oclass_addr, jlong size, jint n_objects);
00160 EXPORT jint JNICALL Java_GridlabD_object_1isa(JNIEnv *env, jobject _this, jlong obj_addr, jstring _typename);
00161 EXPORT jlong JNICALL Java_GridlabD_publish_1variable(JNIEnv *env, jobject _this, jlong moduleaddr, jlong classaddr, jstring varname, jstring vartype, jlong offset);
00162 EXPORT jlong JNICALL Java_GridlabD_publish_1function(JNIEnv *env, jobject _this, jlong moduleaddr, jlong classaddr, jstring funcname);
00163 EXPORT jint JNICALL Java_GridlabD_set_1dependent(JNIEnv *env, jobject _this, jlong from_addr, jlong to_addr);
00164 EXPORT jint JNICALL Java_GridlabD_set_1parent(JNIEnv *env, jobject _this, jlong child_addr, jlong parent_addr);
00165 EXPORT jint JNICALL Java_GridlabD_register_1type(JNIEnv *env, jobject _this, jlong oclass_addr, jstring _typename, jstring from_string_fname, jstring to_string_fname);
00166 EXPORT jint JNICALL Java_GridlabD_publish_1delegate(JNIEnv *env, jobject _this);
00167 EXPORT jlong JNICALL Java_GridlabD_get_1property(JNIEnv *env, jobject _this, jlong oaddr, jstring propertyname);
00168 EXPORT jstring JNICALL Java_GridlabD_get_1value(JNIEnv *env, jobject _this, jlong object_addr, jstring propertyname);
00169 EXPORT jint JNICALL Java_GridlabD_set_1value(JNIEnv *env, jobject _this, jlong object_addr, jstring propertyname, jstring value);
00170 EXPORT jdouble JNICALL Java_GridlabD_unit_1convert(JNIEnv *env, jobject _this, jstring from, jstring to, jdouble invalue);
00171 EXPORT jlong JNICALL Java_GridlabD_get_1object(JNIEnv *env, jobject _this, jstring oname);
00172 EXPORT jint JNICALL Java_GridlabD_get_1int16(JNIEnv *env, jobject _this, jlong object_addr, jlong property_addr);
00173 EXPORT jint JNICALL Java_GridlabD_get_1int16_1by_1name(JNIEnv *env, jobject _this, jlong object_addr, jstring propertyname);
00174 EXPORT jint JNICALL Java_GridlabD_get_1int32(JNIEnv *env, jobject _this, jlong object_addr, jlong property_addr);
00175 EXPORT jint JNICALL Java_GridlabD_get_1int32_1by_1name(JNIEnv *env, jobject _this, jlong object_addr, jstring propertyname);
00176 EXPORT jlong JNICALL Java_GridlabD_get_1int64(JNIEnv *env, jobject _this, jlong object_addr, jlong property_addr);
00177 EXPORT jlong JNICALL Java_GridlabD_get_1int64_1by_1name(JNIEnv *env, jobject _this, jlong object_addr, jstring propertyname);
00178 EXPORT jdouble JNICALL Java_GridlabD_get_1double(JNIEnv *env, jobject _this, jlong object_addr, jlong property_addr);
00179 EXPORT jdouble JNICALL Java_GridlabD_get_1double_1by_1name(JNIEnv *env, jobject _this, jlong object_addr, jstring propertyname);
00180 EXPORT jstring JNICALL Java_GridlabD_get_1string(JNIEnv *env, jobject _this, jlong object_addr, jlong property_addr);
00181 EXPORT jstring JNICALL Java_GridlabD_get_1string_1by_1name(JNIEnv *env, jobject _this, jlong object_addr, jstring propertyname);
00182 EXPORT jlong JNICALL Java_GridlabD_create_1aggregate(JNIEnv *env, jobject _this, jstring aggregator, jstring group_expression);
00183 EXPORT jdouble JNICALL Java_GridlabD_run_1aggregate(JNIEnv *env, jobject _this, jlong aggregate_addr);
00184 EXPORT jdouble JNICALL Java_GridlabD_random_1unifrom(JNIEnv *env, jobject _this, jdouble a, jdouble b);
00185 EXPORT jdouble JNICALL Java_GridlabD_random_1normal(JNIEnv *env, jobject _this, jdouble m, jdouble s);
00186 EXPORT jdouble JNICALL Java_GridlabD_random_1lognormal(JNIEnv *env, jobject _this, jdouble m, jdouble s);
00187 EXPORT jdouble JNICALL Java_GridlabD_random_1bernoulli(JNIEnv *env, jobject _this, jdouble p);
00188 EXPORT jdouble JNICALL Java_GridlabD_random_1pareto(JNIEnv *env, jobject _this, jdouble m, jdouble s);
00189 EXPORT jdouble JNICALL Java_GridlabD_random_1sampled(JNIEnv *env, jobject _this, jint n, jdoubleArray x);
00190 EXPORT jdouble JNICALL Java_GridlabD_random_1exponential(JNIEnv *env, jobject _this, jdouble l);
00191 EXPORT jlong JNICALL Java_GridlabD_parsetime(JNIEnv *env, jobject _this, jstring value);
00192 EXPORT jdouble JNICALL Java_GridlabD_todays(JNIEnv *env, jobject _this, jlong t);
00193 EXPORT jdouble JNICALL Java_GridlabD_tohours(JNIEnv *env, jobject _this, jlong t);
00194 EXPORT jdouble JNICALL Java_GridlabD_tominutes(JNIEnv *env, jobject _this, jlong t);
00195 EXPORT jlong JNICALL Java_GridlabD_global_1create(JNIEnv *env, jobject _this, jstring name, jstring args);
00196 EXPORT jint JNICALL Java_GridlabD_global_1setvar(JNIEnv *env, jobject _this, jstring def, jstring args);
00197 EXPORT jstring JNICALL Java_GridlabD_global_1getvar(JNIEnv *env, jobject _this, jstring name);
00198 EXPORT jlong JNICALL Java_GridlabD_global_1find(JNIEnv *env, jobject _this, jstring name);
00199
00200 #endif
00201
00202