diff --git a/JNIdll/BDI.dll b/JNIdll/BDI.dll new file mode 100644 index 0000000..d794ca3 Binary files /dev/null and b/JNIdll/BDI.dll differ diff --git a/JNIdll/BDI_dll.cpp b/JNIdll/BDI_dll.cpp index 3d92399..7ee9e1b 100644 --- a/JNIdll/BDI_dll.cpp +++ b/JNIdll/BDI_dll.cpp @@ -1,13 +1,15 @@ #include #include #include +#include #define EXPORT JNIEXPORT -//#define STACKTRACE_DEPTH 5 -#define NOF_VM_ARGS 5 -//#define PIPEBUFSIZE 4096 -//#define PIPE_TIMEOUT 500 //ms +#define NOF_VM_ARGS 4 + +#define PIPEBUFSIZE 4096 +#define PIPE_TIMEOUT 500 //ms + // Classes #define USB_Device_Class "ch/ntb/mcdp/usb/USBDevice" #define BDI555_Class "ch/ntb/mcdp/bdi/MPC555" @@ -19,9 +21,17 @@ JNIEnv *env = NULL; JavaVM *jvm = NULL; +// Pipe names +char stdout_pipename[32] = "\\\\.\\pipe\\BDIDll_stdout"; +char stderr_pipename[32] = "\\\\.\\pipe\\BDIDll_stderr"; // Pipe handles HANDLE hStdout_pipe, hStderr_pipe; +// status flags +int stdOutErr_redirected = FALSE; +int jvm_created = FALSE, jvm_classPtrs_done = FALSE, \ + jvm_mIDs_done = FALSE, jvm_redirection_done = FALSE; + // Java classes jclass cls_USB_Device, cls_BDI555, cls_BDI332, cls_Redirect, cls_Uart0; // USB_Device @@ -46,6 +56,70 @@ jmethodID mid_Redirect_redirect; // Uart0 jmethodID mid_Uart0_write, mid_Uart0_read; +BOOL setupNamedPipes(){ + + hStdout_pipe = CreateNamedPipe( + stdout_pipename, // pipe name + PIPE_ACCESS_INBOUND,// server only writes and client only reads + PIPE_TYPE_BYTE | // message type pipe + PIPE_WAIT, // non blocking mode + 1, // max. instances + PIPEBUFSIZE, // output buffer size + PIPEBUFSIZE, // input buffer size + PIPE_TIMEOUT, // client time-out + NULL); // default security attribute + + if (hStdout_pipe == INVALID_HANDLE_VALUE) + { + fprintf(stderr, "CreateNamedPipe (stdout_pipe) failed\n"); + return FALSE; + } + + hStderr_pipe = CreateNamedPipe( + stderr_pipename, // pipe name + PIPE_ACCESS_INBOUND,// server only writes and client only reads + PIPE_TYPE_BYTE | // message type pipe + PIPE_WAIT, // non blocking mode + 1, // max. instances + PIPEBUFSIZE, // output buffer size + PIPEBUFSIZE, // input buffer size + PIPE_TIMEOUT, // client time-out + NULL); // default security attribute + + if (hStderr_pipe == INVALID_HANDLE_VALUE) + { + fprintf(stderr, "CreateNamedPipe (stderr_pipe) failed\n"); + return FALSE; + } + // Connect the reading end of the hStdout_pipe and assign it to stdout + if (freopen(stdout_pipename, "w", stdout) == NULL) { + fprintf(stderr, "freopen(stdout_pipename, w, stdout) failed\n"); + return FALSE; + } + + // Connect the reading end of the hStderr_pipe and assign it to sterr + if (freopen(stderr_pipename, "w", stderr) == NULL) { + fprintf(stderr, "freopen(stderr_pipename, w, stderr) failed\n"); + return FALSE; + } + return TRUE; +} + +void flushAll() +{ + fflush(stderr); + fflush(stdout); +} + +void fprintf_flush(FILE* stream, const char *format, ...) +{ + va_list argptr; + va_start(argptr, format); + + vfprintf(stream, format, argptr); + fflush(stream); +} + EXPORT HANDLE getOutPipeHandle(){ return hStdout_pipe; } @@ -54,23 +128,6 @@ EXPORT HANDLE getErrPipeHandle(){ return hStderr_pipe; } - -//BOOL redirect(){ -// -// // Connect the reading end of the hStdout_pipe and assign it to stdout -// if (freopen(stdout_pipename, "w", stdout) == NULL) { -// fprintf(stderr, "freopen(stdout_pipename, w, stdout) failed\n"); -// return FALSE; -// } -// -// // Connect the reading end of the hStderr_pipe and assign it to sterr -// if (freopen(stderr_pipename, "w", stderr) == NULL) { -// fprintf(stderr, "freopen(stderr_pipename, w, stderr) failed\n"); -// return FALSE; -// } -// return TRUE; -//} - EXPORT int destroyJVM() { jint result = -1; @@ -78,18 +135,18 @@ EXPORT int destroyJVM() if (env->ExceptionOccurred()) { env->ExceptionDescribe(); } - env = NULL; } if (jvm) { result = jvm->DestroyJavaVM(); - jvm = NULL; - fprintf(stderr, "JVM destroyed\n"); + fprintf_flush(stderr, "JVM destroyed\n"); } -// if (!CloseHandle(hStdout_pipe)) -// fprintf(stderr, "Close stdout_pipe failed\n"); -// if (!CloseHandle(hStderr_pipe)) -// fprintf(stderr, "Close stderr_pipe failed\n"); - return result; + // reset flags + jvm_created = FALSE; + jvm_classPtrs_done = FALSE; + jvm_mIDs_done = FALSE; + jvm_redirection_done = FALSE; + + return result; } jint JNICALL _vfprintf_(FILE *fp, const char *format, va_list args) @@ -100,340 +157,346 @@ jint JNICALL _vfprintf_(FILE *fp, const char *format, va_list args) EXPORT int createJVM(char *classpath) { - - char javaclasspath[128]; + char javaclasspath[1024]; jint res; JavaVMInitArgs vm_args; JavaVMOption options[NOF_VM_ARGS]; - if (jvm == NULL) { - -// if (!setupNamedPipes()) { -// printf("setupNamedPipes() failed\n"); -// return FALSE; -// } + if (!stdOutErr_redirected) { + // writing to the stdout/stderr stream will write to pipes + // USE fprintf_flush INSTEAD OF printf/fprintf TO WRITE TO THE PIPES + if (!setupNamedPipes()) { + fprintf_flush(stderr, "setupNamedPipes() failed\n"); + return FALSE; + } + stdOutErr_redirected = TRUE; + } + if (!jvm_created) { + + fprintf_flush(stdout, "Starting JVM: classpath: %s\n", classpath); + sprintf(javaclasspath, "-Djava.class.path=%s", classpath); - // TODO: remove - printf("classpath: %s\n", javaclasspath); - - options[0].optionString = javaclasspath; - options[1].optionString = "-Xms4M"; - options[2].optionString = "-Xmx64M"; - options[3].optionString = "-Xss512K"; - options[4].optionString = "-Xoss400K"; -// options[1].optionString = "-Xoss"; -// options[2].optionString = "-Xmx512m"; -// options[3].optionString = "-Xss5m"; -// options[1].optionString = "-XX:+StackTraceInThrowable"; -// options[2].optionString = "-Xcheck:jni"; -// -// options[3].optionString = "vfprintf"; -// options[3].extraInfo = (void*) _vfprintf_; - - // sprintf(options[2].optionString, "-XX:MaxJavaStackTraceDepth=%d", STACKTRACE_DEPTH); + options[0].optionString = "-Xmx20m"; // specify the maximum heap size that the JVM is allowed to grow to + options[1].optionString = javaclasspath; + options[2].optionString = "-verbose:class,jni"; + options[3].optionString = "-Djava.compiler=NONE"; vm_args.version = JNI_VERSION_1_4; vm_args.options = options; vm_args.nOptions = NOF_VM_ARGS; vm_args.ignoreUnrecognized = JNI_FALSE; - - // TODO: remove - printf("trying to create jvm\n"); /* Create the Java VM */ res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (res < 0) { - fprintf(stderr, "Can't create Java VM\n"); + fprintf_flush(stderr, "Can't create Java VM\n"); return FALSE; } - - // TODO: remove - printf("jvm created\n"); - + jvm_created = TRUE; + } else { + fprintf_flush(stdout, "JVM already created -> creating class pointers\n"); + } + + if (!jvm_classPtrs_done) { /* create class pointers */ cls_USB_Device = env->FindClass(USB_Device_Class); if (cls_USB_Device == 0) { - fprintf(stderr, "Can't find %s class", USB_Device_Class); + fprintf_flush(stderr, "Can't find %s class\n", USB_Device_Class); return FALSE; } cls_BDI555 = env->FindClass(BDI555_Class); if (cls_BDI555 == 0) { - fprintf(stderr, "Can't find %s class", BDI555_Class); + fprintf_flush(stderr, "Can't find %s class\n", BDI555_Class); return FALSE; } cls_BDI332 = env->FindClass(BDI332_Class); if (cls_BDI332 == 0) { - fprintf(stderr, "Can't find %s class", BDI332_Class); - return FALSE; - } - - cls_Redirect = env->FindClass(Redirect_Class); - if (cls_Redirect == 0) { - fprintf(stderr, "Can't find %s class", Redirect_Class); - return FALSE; - } - - cls_Uart0 = env->FindClass(Uart0_Class); - if (cls_Uart0 == 0) { - fprintf(stderr, "Can't find %s class", Uart0_Class); + fprintf_flush(stderr, "Can't find %s class\n", BDI332_Class); return FALSE; } + cls_Redirect = env->FindClass(Redirect_Class); + if (cls_Redirect == 0) { + fprintf_flush(stderr, "Can't find %s class\n", Redirect_Class); + return FALSE; + } + + cls_Uart0 = env->FindClass(Uart0_Class); + if (cls_Uart0 == 0) { + fprintf_flush(stderr, "Can't find %s class\n", Uart0_Class); + return FALSE; + } + jvm_classPtrs_done = TRUE; + } else { + fprintf_flush(stdout, "Class Pointers already created -> creating method IDs\n"); + } + + if (!jvm_mIDs_done) { /* create method pointers */ // USB_Device mid_USB_Dev_open = env->GetStaticMethodID(cls_USB_Device, "open", "()V"); if (mid_USB_Dev_open == 0) { - fprintf(stderr, "Can't find USB_Device.open\n"); + fprintf_flush(stderr, "Can't find USB_Device.open\n"); return FALSE; } mid_USB_Dev_close = env->GetStaticMethodID(cls_USB_Device, "close", "()V"); if (mid_USB_Dev_close == 0) { - fprintf(stderr, "Can't find USB_Device.close\n"); + fprintf_flush(stderr, "Can't find USB_Device.close\n"); return FALSE; } mid_USB_Dev_reset = env->GetStaticMethodID(cls_USB_Device, "reset", "()V"); if (mid_USB_Dev_reset == 0) { - fprintf(stderr, "Can't find USB_Device.reset\n"); + fprintf_flush(stderr, "Can't find USB_Device.reset\n"); return FALSE; } // BDI555 mid_BDI555_break_ = env->GetStaticMethodID(cls_BDI555, "break_", "()V"); if (mid_BDI555_break_ == 0) { - fprintf(stderr, "Can't find BDI555.break_\n"); + fprintf_flush(stderr, "Can't find BDI555.break_\n"); return FALSE; } mid_BDI555_go = env->GetStaticMethodID(cls_BDI555, "go", "()V"); if (mid_BDI555_go == 0) { - fprintf(stderr, "Can't find BDI555.go\n"); + fprintf_flush(stderr, "Can't find BDI555.go\n"); return FALSE; } mid_BDI555_reset_target = env->GetStaticMethodID(cls_BDI555, "reset_target", "()V"); if (mid_BDI555_reset_target == 0) { - fprintf(stderr, "Can't find BDI555.reset_target\n"); + fprintf_flush(stderr, "Can't find BDI555.reset_target\n"); return FALSE; } mid_BDI555_isFreezeAsserted = env->GetStaticMethodID(cls_BDI555, "isFreezeAsserted", "()Z"); if (mid_BDI555_isFreezeAsserted == 0) { - fprintf(stderr, "Can't find BDI555.isFreezeAsserted\n"); + fprintf_flush(stderr, "Can't find BDI555.isFreezeAsserted\n"); return FALSE; } mid_BDI555_startFastDownload = env->GetStaticMethodID(cls_BDI555, "startFastDownload", "(I)V"); if (mid_BDI555_startFastDownload == 0) { - fprintf(stderr, "Can't find BDI555.startFastDownload\n"); + fprintf_flush(stderr, "Can't find BDI555.startFastDownload\n"); return FALSE; } mid_BDI555_fastDownload = env->GetStaticMethodID(cls_BDI555, "fastDownload", "([II)V"); if (mid_BDI555_fastDownload == 0) { - fprintf(stderr, "Can't find BDI555.fastDownload\n"); + fprintf_flush(stderr, "Can't find BDI555.fastDownload\n"); return FALSE; } mid_BDI555_stopFastDownload = env->GetStaticMethodID(cls_BDI555, "stopFastDownload", "()V"); if (mid_BDI555_stopFastDownload == 0) { - fprintf(stderr, "Can't find BDI555.stopFastDownload\n"); + fprintf_flush(stderr, "Can't find BDI555.stopFastDownload\n"); return FALSE; } mid_BDI555_writeMem = env->GetStaticMethodID(cls_BDI555, "writeMem", "(III)V"); if (mid_BDI555_writeMem == 0) { - fprintf(stderr, "Can't find BDI555.writeMem\n"); + fprintf_flush(stderr, "Can't find BDI555.writeMem\n"); return FALSE; } mid_BDI555_readMem = env->GetStaticMethodID(cls_BDI555, "readMem", "(II)I"); if (mid_BDI555_readMem == 0) { - fprintf(stderr, "Can't find BDI555.readMem\n"); + fprintf_flush(stderr, "Can't find BDI555.readMem\n"); return FALSE; } mid_BDI555_writeMemSeq = env->GetStaticMethodID(cls_BDI555, "writeMemSeq", "(II)V"); if (mid_BDI555_writeMemSeq == 0) { - fprintf(stderr, "Can't find BDI555.writeMemSeq\n"); + fprintf_flush(stderr, "Can't find BDI555.writeMemSeq\n"); return FALSE; } mid_BDI555_readMemSeq = env->GetStaticMethodID(cls_BDI555, "readMemSeq", "(I)I"); if (mid_BDI555_readMemSeq == 0) { - fprintf(stderr, "Can't find BDI555.readMemSeq\n"); + fprintf_flush(stderr, "Can't find BDI555.readMemSeq\n"); return FALSE; } mid_BDI555_readGPR = env->GetStaticMethodID(cls_BDI555, "readGPR", "(I)I"); if (mid_BDI555_readGPR == 0) { - fprintf(stderr, "Can't find BDI555.readGPR\n"); + fprintf_flush(stderr, "Can't find BDI555.readGPR\n"); return FALSE; } mid_BDI555_writeGPR = env->GetStaticMethodID(cls_BDI555, "writeGPR", "(II)V"); if (mid_BDI555_writeGPR == 0) { - fprintf(stderr, "Can't find BDI555.writeGPR\n"); + fprintf_flush(stderr, "Can't find BDI555.writeGPR\n"); return FALSE; } mid_BDI555_readSPR = env->GetStaticMethodID(cls_BDI555, "readSPR", "(I)I"); if (mid_BDI555_readSPR == 0) { - fprintf(stderr, "Can't find BDI555.readSPR\n"); + fprintf_flush(stderr, "Can't find BDI555.readSPR\n"); return FALSE; } mid_BDI555_writeSPR = env->GetStaticMethodID(cls_BDI555, "writeSPR", "(II)V"); if (mid_BDI555_writeSPR == 0) { - fprintf(stderr, "Can't find BDI555.writeSPR\n"); + fprintf_flush(stderr, "Can't find BDI555.writeSPR\n"); return FALSE; } mid_BDI555_readMSR = env->GetStaticMethodID(cls_BDI555, "readMSR", "()I"); if (mid_BDI555_readMSR == 0) { - fprintf(stderr, "Can't find BDI555.readMSR\n"); + fprintf_flush(stderr, "Can't find BDI555.readMSR\n"); return FALSE; } mid_BDI555_writeMSR = env->GetStaticMethodID(cls_BDI555, "writeMSR", "(I)V"); if (mid_BDI555_writeMSR == 0) { - fprintf(stderr, "Can't find BDI555.writeMSR\n"); + fprintf_flush(stderr, "Can't find BDI555.writeMSR\n"); return FALSE; } mid_BDI555_readFPR = env->GetStaticMethodID(cls_BDI555, "readFPR", "(II)J"); if (mid_BDI555_readFPR == 0) { - fprintf(stderr, "Can't find BDI555.readFPR\n"); + fprintf_flush(stderr, "Can't find BDI555.readFPR\n"); return FALSE; } mid_BDI555_writeFPR = env->GetStaticMethodID(cls_BDI555, "writeFPR", "(IIJ)V"); if (mid_BDI555_writeFPR == 0) { - fprintf(stderr, "Can't find BDI555.writeFPR\n"); + fprintf_flush(stderr, "Can't find BDI555.writeFPR\n"); return FALSE; } mid_BDI555_readCR = env->GetStaticMethodID(cls_BDI555, "readCR", "()I"); if (mid_BDI555_readCR == 0) { - fprintf(stderr, "Can't find BDI555.readCR\n"); + fprintf_flush(stderr, "Can't find BDI555.readCR\n"); return FALSE; } mid_BDI555_writeCR = env->GetStaticMethodID(cls_BDI555, "writeCR", "(I)V"); if (mid_BDI555_writeCR == 0) { - fprintf(stderr, "Can't find BDI555.writeCR\n"); + fprintf_flush(stderr, "Can't find BDI555.writeCR\n"); return FALSE; } mid_BDI555_readFPSCR = env->GetStaticMethodID(cls_BDI555, "readFPSCR", "()I"); if (mid_BDI555_readFPSCR == 0) { - fprintf(stderr, "Can't find BDI555.readFPSCR\n"); + fprintf_flush(stderr, "Can't find BDI555.readFPSCR\n"); return FALSE; } mid_BDI555_writeFPSCR = env->GetStaticMethodID(cls_BDI555, "writeFPSCR", "(I)V"); if (mid_BDI555_writeFPSCR == 0) { - fprintf(stderr, "Can't find BDI555.writeFPSCR\n"); + fprintf_flush(stderr, "Can't find BDI555.writeFPSCR\n"); return FALSE; } mid_BDI555_isTargetInDebugMode = env->GetStaticMethodID(cls_BDI555, "isTargetInDebugMode", "()Z"); if (mid_BDI555_isTargetInDebugMode == 0) { - fprintf(stderr, "Can't find BDI555.isTargetInDebugMode\n"); + fprintf_flush(stderr, "Can't find BDI555.isTargetInDebugMode\n"); return FALSE; } mid_BDI555_setGpr31 = env->GetStaticMethodID(cls_BDI555, "setGpr31", "(I)V"); if (mid_BDI555_setGpr31 == 0) { - fprintf(stderr, "Can't find BDI555.setGpr31\n"); + fprintf_flush(stderr, "Can't find BDI555.setGpr31\n"); return FALSE; } // BDI332 mid_BDI332_nopsToLegalCmd = env->GetStaticMethodID(cls_BDI332, "nopsToLegalCmd", "()V"); if (mid_BDI332_nopsToLegalCmd == 0) { - fprintf(stderr, "Can't find BDI332.nopsToLegalCmd\n"); + fprintf_flush(stderr, "Can't find BDI332.nopsToLegalCmd\n"); return FALSE; } mid_BDI332_break_ = env->GetStaticMethodID(cls_BDI332, "break_", "()V"); if (mid_BDI332_break_ == 0) { - fprintf(stderr, "Can't find BDI332.break_\n"); + fprintf_flush(stderr, "Can't find BDI332.break_\n"); return FALSE; } mid_BDI332_go = env->GetStaticMethodID(cls_BDI332, "go", "()V"); if (mid_BDI332_go == 0) { - fprintf(stderr, "Can't find BDI332.go\n"); + fprintf_flush(stderr, "Can't find BDI332.go\n"); return FALSE; } mid_BDI332_reset_target = env->GetStaticMethodID(cls_BDI332, "reset_target", "()V"); if (mid_BDI332_reset_target == 0) { - fprintf(stderr, "Can't find BDI332.reset_target\n"); + fprintf_flush(stderr, "Can't find BDI332.reset_target\n"); return FALSE; } mid_BDI332_reset_peripherals = env->GetStaticMethodID(cls_BDI332, "reset_peripherals", "()V"); if (mid_BDI332_reset_peripherals == 0) { - fprintf(stderr, "Can't find BDI332.reset_peripherals\n"); + fprintf_flush(stderr, "Can't find BDI332.reset_peripherals\n"); return FALSE; } mid_BDI332_isFreezeAsserted = env->GetStaticMethodID(cls_BDI332, "isFreezeAsserted", "()Z"); if (mid_BDI332_isFreezeAsserted == 0) { - fprintf(stderr, "Can't find BDI332.isFreezeAsserted\n"); + fprintf_flush(stderr, "Can't find BDI332.isFreezeAsserted\n"); return FALSE; } mid_BDI332_fillMem = env->GetStaticMethodID(cls_BDI332, "fillMem", "([II)V"); if (mid_BDI332_fillMem == 0) { - fprintf(stderr, "Can't find BDI332.fillMem\n"); + fprintf_flush(stderr, "Can't find BDI332.fillMem\n"); return FALSE; } mid_BDI332_dumpMem = env->GetStaticMethodID(cls_BDI332, "dumpMem", "(I)[I"); if (mid_BDI332_dumpMem == 0) { - fprintf(stderr, "Can't find BDI332.dumpMem\n"); + fprintf_flush(stderr, "Can't find BDI332.dumpMem\n"); return FALSE; } mid_BDI332_writeMem = env->GetStaticMethodID(cls_BDI332, "writeMem", "(III)V"); if (mid_BDI332_writeMem == 0) { - fprintf(stderr, "Can't find BDI332.writeMem\n"); + fprintf_flush(stderr, "Can't find BDI332.writeMem\n"); return FALSE; } mid_BDI332_readMem = env->GetStaticMethodID(cls_BDI332, "readMem", "(II)I"); if (mid_BDI332_readMem == 0) { - fprintf(stderr, "Can't find BDI332.readMem\n"); + fprintf_flush(stderr, "Can't find BDI332.readMem\n"); return FALSE; } mid_BDI332_readUserReg = env->GetStaticMethodID(cls_BDI332, "readUserReg", "(I)I"); if (mid_BDI332_readUserReg == 0) { - fprintf(stderr, "Can't find BDI332.readUserReg\n"); + fprintf_flush(stderr, "Can't find BDI332.readUserReg\n"); return FALSE; } mid_BDI332_writeUserReg = env->GetStaticMethodID(cls_BDI332, "writeUserReg", "(II)V"); if (mid_BDI332_writeUserReg == 0) { - fprintf(stderr, "Can't find BDI332.writeUserReg\n"); + fprintf_flush(stderr, "Can't find BDI332.writeUserReg\n"); return FALSE; } mid_BDI332_readUserReg = env->GetStaticMethodID(cls_BDI332, "readUserReg", "(I)I"); if (mid_BDI332_readUserReg == 0) { - fprintf(stderr, "Can't find BDI332.readUserReg\n"); + fprintf_flush(stderr, "Can't find BDI332.readUserReg\n"); return FALSE; } mid_BDI332_writeSysReg = env->GetStaticMethodID(cls_BDI332, "writeSysReg", "(II)V"); if (mid_BDI332_writeSysReg == 0) { - fprintf(stderr, "Can't find BDI332.writeSysReg\n"); + fprintf_flush(stderr, "Can't find BDI332.writeSysReg\n"); return FALSE; } mid_BDI332_readSysReg = env->GetStaticMethodID(cls_BDI332, "readSysReg", "(I)I"); if (mid_BDI332_readSysReg == 0) { - fprintf(stderr, "Can't find BDI332.readSysReg\n"); + fprintf_flush(stderr, "Can't find BDI332.readSysReg\n"); return FALSE; } mid_BDI332_isTargetInDebugMode = env->GetStaticMethodID(cls_BDI332, "isTargetInDebugMode", "()Z"); if (mid_BDI332_isTargetInDebugMode == 0) { - fprintf(stderr, "Can't find BDI332.isTargetInDebugMode\n"); + fprintf_flush(stderr, "Can't find BDI332.isTargetInDebugMode\n"); return FALSE; } - + // Redirect Class mid_Redirect_redirect = env->GetStaticMethodID(cls_Redirect, "redirect", "()V"); if (mid_Redirect_redirect == 0) { - fprintf(stderr, "Can't find Redirect.redirect\n"); + fprintf_flush(stderr, "Can't find Redirect.redirect\n"); return FALSE; } - - // Call redirect - env->CallStaticVoidMethod(cls_Redirect, mid_Redirect_redirect); // Uart0 Class mid_Uart0_write = env->GetStaticMethodID(cls_Uart0, "write", "([BI)Z"); if (mid_Uart0_write == 0) { - fprintf(stderr, "Can't find Uart0.write\n"); + fprintf_flush(stderr, "Can't find Uart0.write\n"); return FALSE; } mid_Uart0_read = env->GetStaticMethodID(cls_Uart0, "read", "()[B"); if (mid_Uart0_read == 0) { - fprintf(stderr, "Can't find Uart0.read\n"); + fprintf_flush(stderr, "Can't find Uart0.read\n"); return FALSE; } - + + jvm_mIDs_done = TRUE; + } else { + fprintf_flush(stdout, "Method IDs already created -> trying to redirect ouput streams\n"); } + + if (!jvm_redirection_done) { + // Call redirect + env->CallStaticVoidMethod(cls_Redirect, mid_Redirect_redirect); + + jvm_redirection_done = TRUE; + } else { + fprintf_flush(stdout, "Redirection already done -> everything successfully set up!\n"); + } + return TRUE; } @@ -452,7 +515,10 @@ EXPORT int checkForExceptions() { return FALSE; } -// USB_Device methods +/* USB_Device methods + * + * For documentatione see the java doc. + */ EXPORT void USB_Device_open() { env->CallStaticVoidMethod(cls_USB_Device, mid_USB_Dev_open); @@ -468,7 +534,10 @@ EXPORT void USB_Device_reset() env->CallStaticVoidMethod(cls_USB_Device, mid_USB_Dev_reset); } -// BDI 555 methods +/* BDI 555 methods + * + * For documentatione see the java doc. + */ EXPORT void BDI555_break_() { env->CallStaticVoidMethod(cls_BDI555, mid_BDI555_break_); @@ -613,7 +682,10 @@ EXPORT void BDI555_setGpr31(int gpr31) } -// BDI 332 methods +/* BDI 332 methods + * + * For documentatione see the java doc. + */ EXPORT void BDI332_nopsToLegalCmd() { env->CallStaticVoidMethod(cls_BDI332, mid_BDI332_nopsToLegalCmd); @@ -660,7 +732,7 @@ EXPORT void BDI332_fillMem(int downloadData[], int dataLength) return; } // for (int i = 0; i < dataLength; ++i) { -// printf("data %d: %x\n", i, downloadData[i]); +// fprintf_flush(stdout, ("data %d: %x\n", i, downloadData[i]); // } env->SetIntArrayRegion(jdata, 0, dataLength, (jint*) downloadData); @@ -722,6 +794,11 @@ EXPORT BOOL BDI332_isTargetInDebugMode() return (isAsserted != JNI_FALSE); } +/* + * UART functions + * + * For documentatione see the java doc. + */ EXPORT int UART0_read(char result[]) { jbyteArray byteArray; @@ -754,7 +831,7 @@ EXPORT int UART0_write(char data[], int dataLength) return FALSE; } // for (int i = 0; i < dataLength; ++i) { -// printf("data %d: %x\n", i, data[i]); +// fprintf_flush(stdout, ("data %d: %x\n", i, data[i]); // } env->SetByteArrayRegion(jdata, 0, dataLength, (jbyte*) data); diff --git a/JNIdll/makefile b/JNIdll/makefile index fc70261..8c1e514 100644 --- a/JNIdll/makefile +++ b/JNIdll/makefile @@ -1,34 +1,12 @@ -EXESRC=BDI_exe.cpp -SRC=invoke.cpp DLLSRC=BDI_dll.cpp DLL=BDI.dll DEF=BDI.def -IMPLIB=BDI555.lib -IMPLIBA=libbdi555.a JVMLIBA=libjvm.a OBJ=$(SRC:.c=.o) # replaces the .c from SRC with .o -EXE=BDI_exe.exe -INVOKE=invoke.exe JAVA_HOME="C:/Program Files/Java/jdk1.5.0_04" CC=gcc RM=rm -REIMP=reimp - -all: $(INVOKE) # all is dependent on $(EXE) to be complete -$(INVOKE): $(OBJ) # $(EXE) is dependent on all of the files in $(OBJ) to exist - $(CC) -Wall -D_JNI_IMPLEMENTATION_ \ - -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/win32 \ - -o $(INVOKE) $(SRC) $(JVMLIBA) - -exe: $(EXE) # all is dependent on $(EXE) to be complete -$(EXE): $(OBJ) # $(EXE) is dependent on all of the files in $(OBJ) to exist - $(CC) -Wall -D_JNI_IMPLEMENTATION_ \ - -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/win32 \ - -o $(EXE) $(EXESRC) $(JVMLIBA) - -cleanExe: - $(RM) $(EXE) dll: $(DLL) $(DLL): $(DLLSRC) @@ -42,15 +20,5 @@ $(DLL): $(DLLSRC) # -I$(JAVAPATH)/include -I$(JAVAPATH)/include/win32 \ # -shared $(DLLSRC) -o $(DLL) $(JVMLIBA) -impLib: $(IMPLIB) -$(IMPLIB): $(DEF) - dlltool -U -d $(DEF) -l $(IMPLIB) - -lib: $(IMPLIBA) -$(IMPLIBA): $(DEF) - lib /machine:i386 /def:$(DEF) - $(REIMP) $(IMPLIB) - clean: $(RM) $(DLL) - $(RM) $(EXE)