13 #include <../../nrnconf.h> 31 #if defined(JVM_DLOPEN) 33 jint nrn_CreateJavaVM(JavaVM **pvm,
void **penv,
void *args);
65 extern void* (*p_java2nrn_cons)(
Object*);
73 jint nrn_CreateJavaVM(JavaVM **pvm,
void **penv,
void *args);
76 static jint nrn_GetDefaultJavaVMInitArgs(
void*);
77 static jint nrn_CreateJavaVM(JavaVM **pvm, JNIEnv **penv,
void *args);
84 #define PATH_SEPARATOR ';' 86 #define PATH_SEPARATOR ':' 89 #define NULL_CHECK(arg) nrn_assert((arg)) 110 hoc_execerror(
" Java portion of NEURON was not initialized.", 0);
153 tmp[
i].optionString =
options[
i].optionString;
177 NULL_CHECK(ver = (env)->FindClass(
"sun/misc/Version"));
178 NULL_CHECK(print = (env)->GetStaticMethodID(ver,
"print",
"()V"));
180 (
env)->CallStaticVoidMethod(ver, print);
197 vsprintf(buf, format, args);
204 static void initialize_jvm1();
205 static void initialize_jvm1() {
208 args.version = 0x00010001;
212 if (nrn_GetDefaultJavaVMInitArgs(&args) < 0) {
215 classpath =
new char[strlen(args.classpath) + 2*strlen(
neuron_home) + 100];
217 sprintf(classpath,
"%s;/%s/classes/neuron.jar",
219 for (
char* cp = classpath; *cp; ++cp) {
222 }
else if (*cp ==
':') {
227 JNI_GetDefaultJavaMVInitArgs(&args);
228 const char* ucpenv =
getenv(
"CLASSPATH");
235 int len = strlen(args.classpath) + strlen(ucpenv) + 2*strlen(
neuron_home) + 100;
236 classpath =
new char[len];
239 "%s%c.%c%s%c%s/classes/neuron.jar",
248 args.classpath = classpath;
254 printf(
"classpath |%s|\n", args.classpath);
262 fprintf(stderr,
"JNI_CreateJavaVM returned %d\n", res);
265 fprintf(stderr,
"Created Java VM\n");
280 classpath =
new char[len];
289 args.version = JNI_VERSION_1_2;
298 args.ignoreUnrecognized = JNI_FALSE;
300 #if defined(_WIN32) || defined(JVM_DLOPEN) 302 if (res == -10) {
return; }
304 jint res = JNI_CreateJavaVM(&
nrnjava_vm, (
void**)&nrnjava_root_env, &args);
312 fprintf(stderr,
"JNI Version error. VM is not JNI_VERSION_1_2\n");
315 fprintf(stderr,
"Not enough memory\n");
318 fprintf(stderr,
"invalid arguments\n");
321 fprintf(stderr,
"JNI_CreateJavaVM returned %d\n", res);
324 fprintf(stderr,
"Info: optional feature Java VM is not present.\n");
328 fprintf(stderr,
"Created Java VM\n");
353 if (strchr(radixtest,
',')) {
354 setlocale(LC_NUMERIC,
"C");
361 #if defined(JVM_DLOPEN) 363 #include <InterViews/session.h> 365 #include <InterViews/style.h> 366 typedef jint(*PCJVM)(JavaVM**,
void**,
void*);
368 jint nrn_CreateJavaVM(JavaVM **pvm,
void **penv,
void *args) {
373 Session* ses = Session::instance();
375 char*
name =
"jvmdll";
376 if (ses && !ses->style()->find_attribute(name, str)){
386 PCJVM addr = (PCJVM)
dlsym(handle,
"JNI_CreateJavaVM_Impl");
388 PCJVM addr = (PCJVM)
dlsym(handle,
"JNI_CreateJavaVM");
394 res = (*addr)(pvm, penv, args);
403 #if defined(__MWERKS__) && __MWERKS__ >= 7 406 #include <InterViews/session.h> 408 #include <InterViews/style.h> 419 if (!Session::instance()->style()->find_attribute(
name, str)){
424 ret = (
void *) LoadLibrary (str.
string());
426 DWORD dw = GetLastError();
427 fprintf(stderr,
"LoadLibrary(\"%s\") failed with error %d\n", str.
string(), dw);
439 void *
ret = (
void *) GetProcAddress ((HMODULE) handle,
name);
441 fprintf(stderr,
"Could not GetProcAddress for \"%s\"\n", name);
446 #if defined(_MSC_VER) 447 typedef jint(CALLBACK *PCJVM)(JavaVM**,
void**,
void*);
449 typedef jint(*PCJVM)(JavaVM**,
void**,
void*);
452 jint nrn_CreateJavaVM(JavaVM **pvm,
void **penv,
void *args) {
457 void* handle =
dlopen(
"jvmdll", 0);
458 if (!handle) {
return jerr_; }
459 PCJVM addr = (PCJVM)
dlsym(handle,
"JNI_CreateJavaVM");
460 if (!addr) {
return -1; }
461 res = (*addr)(pvm, penv, args);
471 typedef jint(*PCJVM)(JavaVM**, JNIEnv**,
void*);
472 typedef jint(*PIJVM)(
void*);
473 typedef CFragConnectionID(*
PF)();
476 static jint nrn_GetDefaultJavaVMInitArgs(
void* args) {
479 CFragConnectionID
id;
490 fprintf(stderr,
"%s is not the nrnjvmdll\n", name);
494 myErr = GetDiskFragment(&fs, 0, kCFragGoesToEOF,
495 0, kLoadCFrag, &
id, &sa, sname);
499 sname[sname[0]+1]=
'\0';
500 fprintf(stderr,
"could not load the Java VM : %s\n", sname+1);
504 myErr = CountSymbols(
id, &cnt);
506 for (i=0; i <
cnt; ++
i) {
507 myErr = GetIndSymbol(
id, i, sname, &sa, &sc);
508 sname[sname[0]+1] =
'\0';
510 if (strcmp((sname+1),
"nrn2_GetDefaultJavaVMInitArgs") == 0) {
513 if (strcmp((sname+1),
"nrn2_CreateJavaVM") == 0) {
518 jint res = (*iaddr)(args);
520 fprintf(stderr,
"call to JNI_GetDefaultJavaVMInitArgs returned %d\n", res);
524 fprintf(stderr,
"no address for JNI_GetDefaultJavaVMInitArgs\n");
528 static jint nrn_CreateJavaVM(JavaVM **pvm, JNIEnv **penv,
void *args) {
533 fprintf(stderr,
"no address for JNI_CreateJavaVM\n");
536 res = (*caddr)(pvm, penv, args);
char * hoc_back2forward(char *s)
static void AddOption(char *str, void *info)
const char * dlerror(void)
int convertJavaClassToHoc(JNIEnv *, const char *, const char *, const char *)
Make a hoc equivalent to Java class (jname) calling it hname in hoc.
static void PrintJavaVersion(JNIEnv *env)
sprintf(buf," if (secondorder) {\ " int _i;\" " for(_i=0;_i< %d;++_i) {\" " _p[_slist%d[_i]]+=dt *_p[_dlist%d[_i]];\" " }}\", numeqn, listnum, listnum)
const char * string() const
bool is_mac_dll(FSSpec *)
JNIEnv * nrnjava_root_env
void hoc_execerror(const char *, const char *)
char * getenv(const char *s)
void *(* p_java2nrn_cons)(Object *)
fprintf(stderr, "Don't know the location of params at %p\, pp)
static JavaVMOption * options
void * dlopen(const char *path, int mode)
OSErr __path2fss(const char *name, FSSpec *)
void nrn_InitializeJavaVM()
static void initialize_jvm2()
void * dlsym(void *handle, const char *symbol)
jint myvfprintf(FILE *fp, const char *format, va_list args)