00001
00002
00003 #include "gridlabd.h"
00004 #include "gridlabd_java.h"
00005 #include "module.h"
00006
00007 #if 0
00008 mod->major = pMajor?*pMajor:0;
00009 mod->minor = pMinor?*pMinor:0;
00010 mod->import_file = (int(*)(char*))DLSYM(hLib,"import_file");
00011 mod->export_file = (int(*)(char*))DLSYM(hLib,"export_file");
00012 mod->setvar = (int(*)(char*,char*))DLSYM(hLib,"setvar");
00013 mod->getvar = (void*(*)(char*,char*,unsigned int))DLSYM(hLib,"getvar");
00014 mod->check = (int(*)())DLSYM(hLib,"check");
00015 mod->module_test = (int(*)(TEST_CALLBACKS*,int,char*[]))DLSYM(hLib,"module_test");
00016 mod->cmdargs = (int(*)(int,char**))DLSYM(hLib,"cmdargs");
00017 mod->kmldump = (int(*)(FILE*,OBJECT*))DLSYM(hLib,"kmldump");
00018 mod->subload = (MODULE *(*)(char *, MODULE **))DLSYM(hLib, "subload");
00019 mod->globals = NULL;
00020 #endif
00021
00022 EXPORT int create_java(OBJECT **obj, OBJECT *parent);
00023 EXPORT int init_java(OBJECT *obj, OBJECT *parent);
00024 EXPORT TIMESTAMP sync_java(OBJECT *obj, TIMESTAMP t1, PASSCONFIG pass);
00025 EXPORT int notify_java(OBJECT *obj, NOTIFYMODULE msg);
00026 EXPORT int isa_java(OBJECT *obj, char *classname);
00027 EXPORT int64 plc_java(OBJECT *obj, TIMESTAMP t1);
00028 EXPORT int recalc_java(OBJECT *obj);
00029 EXPORT int commit_java(OBJECT *obj);
00030
00031 CLASS *java_init(CALLBACKS *, JAVACALLBACKS *, MODULE *, char *, int, char *[]);
00032
00033 EXPORT MODULE *subload(char *modname, MODULE **pMod, CLASS **cptr, int argc, char **argv){
00034 MODULE *mod = (MODULE *)malloc(sizeof(MODULE));
00035 CLASS *c = NULL;
00036 memset(mod, 0, sizeof(MODULE));
00037 gl_output("glmjava: trying to subload \"%s\"", modname);
00038 java_init(callback, (JAVACALLBACKS *)getvar("jcallback", NULL, NULL), mod, modname, argc, argv);
00039 c = *cptr;
00040 while(c != NULL){
00041 c->create = (FUNCTIONADDR)create_java;
00042 c->init = (FUNCTIONADDR)init_java;
00043 c->isa = (FUNCTIONADDR)isa_java;
00044 c->notify = (FUNCTIONADDR)notify_java;
00045 c->plc = (FUNCTIONADDR)plc_java;
00046 c->recalc = (FUNCTIONADDR)recalc_java;
00047 c->sync = (FUNCTIONADDR)sync_java;
00048 c->commit = (FUNCTIONADDR)commit_java;
00049 c = c->next;
00050 }
00051 return mod;
00052 }
00053
00054 EXPORT int create_java(OBJECT **obj, OBJECT *parent)
00055 {
00056 JNIEnv *jnienv = (JNIEnv *)getvar("jnienv", NULL, NULL);
00057 char *classname = (*obj) ? (*obj)->name : "ERROR_NO_CLASSNAME";
00058 jclass cls = jnienv->FindClass(classname);
00059 if(cls == NULL){
00060 gl_error("create_java: unable to find %s.class", classname);
00061 return 0;
00062 }
00063 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "create", "(J)J");
00064 if(cfunc == NULL){
00065 gl_error("create_java: unable to find long %s.create(long)", classname);
00066 return 0;
00067 }
00068 int64 rv = jnienv->CallStaticLongMethod(cls, cfunc, (int64)parent);
00069 if(rv == 0){
00070 gl_error("create_java: %s.create() failed", classname);
00071 GL_THROW("%s.create() failed", classname);
00072 }
00073 if (jnienv->ExceptionOccurred()) {
00074 jnienv->ExceptionDescribe();
00075 }
00076 *obj = (OBJECT *)rv;
00077 gl_set_parent(*obj, parent);
00078 return 1;
00079 }
00080
00081 EXPORT int init_java(OBJECT *obj, OBJECT *parent){
00082 JNIEnv *jnienv = (JNIEnv *)getvar("jnienv", NULL, NULL);
00083 char *name = obj->oclass->name;
00084 jclass cls = jnienv->FindClass(name);
00085 if(cls == NULL){
00086 gl_error("init_java: unable to find %s.class", name);
00087 return 0;
00088 }
00089 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "init", "(JJ)I");
00090 if(cfunc == NULL){
00091 gl_error("init_java: unable to find int %s.init(long, long)", name);
00092 return 0;
00093 }
00094 int rv = jnienv->CallStaticIntMethod(cls, cfunc, (int64)obj, (int64)parent);
00095 return rv;
00096 }
00097
00098 EXPORT int commit_java(OBJECT *obj){
00099 JNIEnv *jnienv = (JNIEnv *)getvar("jnienv", NULL, NULL);
00100 char *name = obj->oclass->name;
00101 jclass cls = jnienv->FindClass(name);
00102 if(cls == NULL){
00103 gl_error("commit_java: unable to find %s.class", name);
00104 return 0;
00105 }
00106 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "commit", "(J)I");
00107 if(cfunc == NULL){
00108 gl_error("commit_java: unable to find int %s.commit(long)", name);
00109 return 0;
00110 }
00111 int rv = jnienv->CallStaticIntMethod(cls, cfunc, (int64)obj);
00112 return rv;
00113 }
00114
00115 EXPORT TIMESTAMP sync_java(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass){
00116 JNIEnv *jnienv = (JNIEnv *)getvar("jnienv", NULL, NULL);
00117 jclass cls = jnienv->FindClass(obj->oclass->name);
00118 if(cls == NULL){
00119 gl_error("sync_java: unable to find %s.class", obj->oclass->name);
00120 return 0;
00121 }
00122 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "sync", "(JJI)J");
00123 if(cfunc == NULL){
00124 gl_error("sync_java: unable to find long %s.sync(long, long, int)", obj->oclass->name);
00125 return 0;
00126 }
00127 int64 t1 = jnienv->CallStaticLongMethod(cls, cfunc, (int64)obj, t0, pass);
00128 if (pass==PC_POSTTOPDOWN) obj->clock = t0;
00129 return t1;
00130 }
00131
00132 int notify_java(OBJECT *obj, NOTIFYMODULE msg){
00133 JNIEnv *jnienv = (JNIEnv *)getvar("jnienv", NULL, NULL);
00134 jclass cls = jnienv->FindClass(obj->oclass->name);
00135 if(cls == NULL)
00136 {
00137 gl_error("notify_java: unable to find %s.class", obj->oclass->name);
00138 return 0;
00139 }
00140 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "notify", "(JLjava.lang.String;)I");
00141 if(cfunc == NULL)
00142 {
00143
00144
00145 obj->oclass->notify = NULL;
00146 return 0;
00147 }
00148 return jnienv->CallStaticIntMethod(cls, cfunc, (int64)obj, (int)msg);
00149 }
00150
00151 EXPORT int isa_java(OBJECT *obj, char *classname){
00152 JNIEnv *jnienv = (JNIEnv *)getvar("jnienv", NULL, NULL);
00153 jclass cls = jnienv->FindClass(obj->oclass->name);
00154 if(cls == NULL)
00155 {
00156 gl_error("isa_java: unable to find %s.class", obj->oclass->name);
00157 return 0;
00158 }
00159 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "isa", "(JLjava.lang.String;)I");
00160 if(cfunc == NULL)
00161 {
00162 gl_error("isa_java: unable to find int %s.isa(long, String)", obj->oclass->name);
00163 return 0;
00164 }
00165 jstring isaname = jnienv->NewStringUTF(classname);
00166 int rv = jnienv->CallStaticIntMethod(cls, cfunc, (int64)obj, isaname);
00167
00168 return rv;
00169 }
00170
00171 EXPORT int64 plc_java(OBJECT *obj, TIMESTAMP t0){
00172 JNIEnv *jnienv = (JNIEnv *)getvar("jnienv", NULL, NULL);
00173 jclass cls = jnienv->FindClass(obj->oclass->name);
00174 if(cls == NULL){
00175 gl_error("plc_java: unable to find %s.class", obj->oclass->name);
00176 return 0;
00177 }
00178 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "plc", "(JJ)J");
00179 if(cfunc == NULL){
00180
00181
00182 obj->oclass->plc = NULL;
00183 return 0;
00184 }
00185 int64 rv = jnienv->CallStaticLongMethod(cls, cfunc, (int64)obj, t0);
00186 return rv;
00187 }
00188
00189 EXPORT int recalc_java(OBJECT *obj){
00190 JNIEnv *jnienv = (JNIEnv *)getvar("jnienv", NULL, NULL);
00191 jclass cls = jnienv->FindClass(obj->oclass->name);
00192 if(cls == NULL){
00193 gl_error("recalc_java: unable to find %s.class", obj->oclass->name);
00194 return 0;
00195 }
00196 jmethodID cfunc = jnienv->GetStaticMethodID(cls, "recalc", "(J)V");
00197 if(cfunc == NULL){
00198
00199
00200 obj->oclass->recalc = NULL;
00201 return 0;
00202 }
00203 int64 rv = jnienv->CallStaticLongMethod(cls, cfunc, (int64)obj);
00204 return 0;
00205 }
00206
00207 CLASS *java_init(CALLBACKS *fntable, JAVACALLBACKS *jfntable, MODULE *module, char *modulename, int argc, char *argv[])
00208 {
00209 JavaVM *jvm = NULL;
00210 JNIEnv *jnienv = NULL;
00211 if (!set_callback(fntable)) {
00212 errno = EINVAL;
00213 return NULL;
00214 }
00215 JAVACALLBACKS *jcallback = jfntable;
00216 if(jcallback == NULL){
00217 gl_error("%s:java_init() - unable to find jcallback", modulename);
00218 return NULL;
00219 }
00220 if(jvm == NULL)
00221 jvm = get_jvm();
00222 if(jnienv == NULL)
00223 jnienv = get_env();
00224 jstring *jargv = new jstring[argc];
00225 int i = 0;
00226 gl_output("javamod init entered\n");
00227
00228 jclass cls = jnienv->FindClass(modulename);
00229 if(cls == NULL){
00230 gl_error("javamod:init.cpp: unable to find %s.class", modulename);
00231 return NULL;
00232 }
00233
00234 jmethodID init_mid = jnienv->GetStaticMethodID(cls, "init", "(JLjava/lang/String;I[Ljava/lang/String;)J");
00235
00236 if(init_mid == NULL){
00237 gl_error("javamod:init.cpp: unable to find \"int %s.init(long, string, int, string[])\"", modulename);
00238 return NULL;
00239 }
00240
00241 jobjectArray args = jnienv->NewObjectArray(argc, jnienv->FindClass("[Ljava/lang/String;"), NULL);
00242 if(args == NULL){
00243 gl_error("javamod:init.cpp: unable to allocate args[] for %s.init()", modulename);
00244 return NULL;
00245 }
00246
00247 for(i = 0; i < argc; ++i){
00248 jargv[i] = jnienv->NewStringUTF(argv[i]);
00249 jnienv->SetObjectArrayElement(args, i, jargv[i]);
00250 }
00251
00252 jstring jmodname = jnienv->NewStringUTF(modulename);
00253 if(jmodname == NULL){
00254 gl_error("javamod:init.cpp: unable to allocate jmodname for %s.init()", modulename);
00255 }
00256
00257 gl_output("javamod:init.cpp(): moduleaddr = %x", module);
00258
00259 int64 rv = jnienv->CallStaticLongMethod(cls, init_mid, (int64)module, jmodname, argc, jargv);
00260 if (jnienv->ExceptionOccurred()) {
00261 jnienv->ExceptionDescribe();
00262 }
00263
00264
00265 jnienv->DeleteLocalRef(args);
00266 for(i = 0; i < argc; ++i)
00267 ;
00268
00269 gl_output("finished javamod init\n");
00270
00271 return (CLASS *)rv;
00272 }
00273
00274