JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_getByName(JNIEnv * env, jclass cls, jstring jname) { msg_host_t host; /* native host */ jobject jhost; /* global reference to the java host instance returned */ /* get the C string from the java string */ const char *name = (*env)->GetStringUTFChars(env, jname, 0); if (name == NULL) { jxbt_throw_null(env,bprintf("No host can have a null name")); return NULL; } /* get the host by name (the hosts are created during the grid resolution) */ host = MSG_get_host_by_name(name); if (!host) { /* invalid name */ jxbt_throw_host_not_found(env, name); (*env)->ReleaseStringUTFChars(env, jname, name); return NULL; } (*env)->ReleaseStringUTFChars(env, jname, name); if (!MSG_host_get_data(host)) { /* native host not associated yet with java host */ /* Instantiate a new java host */ jhost = jhost_new_instance(env); if (!jhost) { jxbt_throw_jni(env, "java host instantiation failed"); return NULL; } /* get a global reference to the newly created host */ jhost = jhost_ref(env, jhost); if (!jhost) { jxbt_throw_jni(env, "new global ref allocation failed"); return NULL; } /* Sets the java host name */ (*env)->SetObjectField(env, jhost, jhost_field_Host_name, jname); /* bind the java host and the native host */ jhost_bind(jhost, host, env); /* the native host data field is set with the global reference to the * java host returned by this function */ MSG_host_set_data(host, (void *) jhost); } /* return the global reference to the java host instance */ return (jobject) MSG_host_get_data(host); }
JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_create(JNIEnv * env, jobject jprocess_arg, jobject jhostname) { jobject jprocess; /* the global reference to the java process instance */ jstring jname; /* the name of the java process instance */ const char *name; /* the C name of the process */ const char *hostname; msg_process_t process; /* the native process to create */ msg_host_t host; /* Where that process lives */ hostname = (*env)->GetStringUTFChars(env, jhostname, 0); /* get the name of the java process */ jname = jprocess_get_name(jprocess_arg, env); if (!jname) { jxbt_throw_null(env, xbt_strdup("Internal error: Process name cannot be NULL")); return; } /* bind/retrieve the msg host */ host = MSG_host_by_name(hostname); if (!(host)) { /* not bound */ jxbt_throw_host_not_found(env, hostname); return; } /* create a global java process instance */ jprocess = jprocess_new_global_ref(jprocess_arg, env); if (!jprocess) { jxbt_throw_jni(env, "Can't get a global ref to the java process"); return; } /* build the C name of the process */ name = (*env)->GetStringUTFChars(env, jname, 0); name = xbt_strdup(name); /* Retrieve the kill time from the process */ jdouble jkill = (*env)->GetDoubleField(env, jprocess, jprocess_field_Process_killTime); /* Actually build the MSG process */ process = MSG_process_create_with_environment(name, (xbt_main_func_t) jprocess, /*data*/ jprocess, host, /*argc, argv, properties*/ 0,NULL,NULL); MSG_process_set_kill_time(process, (double)jkill); /* bind the java process instance to the native process */ jprocess_bind(jprocess, process, env); /* release our reference to the process name (variable name becomes invalid) */ //FIXME : This line should be uncommented but with mac it doesn't work. BIG WARNING //(*env)->ReleaseStringUTFChars(env, jname, name); (*env)->ReleaseStringUTFChars(env, jhostname, hostname); /* sets the PID and the PPID of the process */ (*env)->SetIntField(env, jprocess, jprocess_field_Process_pid,(jint) MSG_process_get_PID(process)); (*env)->SetIntField(env, jprocess, jprocess_field_Process_ppid, (jint) MSG_process_get_PPID(process)); /* sets the Host of the process */ jobject jhost = Java_org_simgrid_msg_Host_getByName(env,NULL,jhostname); (*env)->SetObjectField(env, jprocess, jprocess_field_Process_host, jhost); }