From 21a36f033c91cc66a82c7b1b77c386c506b2864e Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Tue, 30 Jun 2015 20:58:00 +0000 Subject: [PATCH] Reorganizando estrutura do java devido à problemas na carga da jvm --- src/java/Makefile.in | 2 +- src/java/actions.cc | 8 +++++--- src/java/clipboard.cc | 3 +++ src/java/connect.cc | 6 ++++-- src/java/cursor.cc | 8 +++++--- src/java/dialog.cc | 6 ++++-- src/java/field.cc | 8 +++++--- src/java/getset.cc | 16 +++++++++------- src/java/info.cc | 8 +++++--- src/java/keyboard.cc | 8 +++++--- src/java/main.cc | 31 +++++++++++++++++++------------ src/java/plugin.cc | 4 +++- src/java/private.h | 41 +++++++++++++++++++++++++++++++++++++---- src/java/startstop.cc | 446 +++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 14 files changed, 148 insertions(+), 447 deletions(-) diff --git a/src/java/Makefile.in b/src/java/Makefile.in index f15ddbb..5859212 100644 --- a/src/java/Makefile.in +++ b/src/java/Makefile.in @@ -83,7 +83,7 @@ CXXFLAGS=@CFLAGS@ @CXXFLAGS@ @DLL_CFLAGS@ @JNI_CPPFLAGS@ -I../include # PW3270_LIBS ?= -L../../.bin/Debug@DLLDIR@ -l3270 -lpw3270 PW3270_CFLAGS ?= -I../include -PLUGIN_CFLAGS=@CXXFLAGS@ -Wno-deprecated-declarations @DLL_CFLAGS@ @JNI_CPPFLAGS@ -DJNIDIR="\"$(jnidir)\"" \ +PLUGIN_CFLAGS=@CXXFLAGS@ -DPW3270_PLUGIN -Wno-deprecated-declarations @DLL_CFLAGS@ @JNI_CPPFLAGS@ -DJNIDIR="\"$(jnidir)\"" \ -DJARDIR="\"$(jvmjardir)\"" @GTK_CFLAGS@ @GTKMAC_CFLAGS@ $(PW3270_CFLAGS) PLUGIN_LIBS=@GTK_LIBS@ @GTKMAC_LIBS@ @JVM_LIBS@ diff --git a/src/java/actions.cc b/src/java/actions.cc index 65880cd..e93c9ad 100644 --- a/src/java/actions.cc +++ b/src/java/actions.cc @@ -32,13 +32,15 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace PW3270_NAMESPACE; + JNIEXPORT jint JNICALL Java_pw3270_terminal_quit(JNIEnv *env, jobject obj) { jint rc = -1; try { - rc = getHandle(env,obj)->quit(); + rc = java::getHandle(env,obj)->quit(); } catch(std::exception &e) { @@ -57,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1eof(JNIEnv *env, jobject obj) try { - rc = getHandle(env,obj)->erase_eof(); + rc = java::getHandle(env,obj)->erase_eof(); } catch(std::exception &e) { @@ -76,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_print(JNIEnv *env, jobject obj) { try { - rc = getHandle(env,obj)->print(); + rc = java::getHandle(env,obj)->print(); } catch(std::exception &e) { diff --git a/src/java/clipboard.cc b/src/java/clipboard.cc index e726e97..d94f3d6 100644 --- a/src/java/clipboard.cc +++ b/src/java/clipboard.cc @@ -32,6 +32,9 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace std; +using namespace PW3270_NAMESPACE::java; + JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1copy(JNIEnv *env, jobject obj, jstring j_str) { const char * str = env->GetStringUTFChars(j_str, 0); diff --git a/src/java/connect.cc b/src/java/connect.cc index b55d182..fd4a5ba 100644 --- a/src/java/connect.cc +++ b/src/java/connect.cc @@ -32,6 +32,8 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace PW3270_NAMESPACE; + JNIEXPORT jint JNICALL Java_pw3270_terminal_connect(JNIEnv *env, jobject obj, jstring j_host, jint seconds) { const char * host = env->GetStringUTFChars(j_host, 0); @@ -39,7 +41,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_connect(JNIEnv *env, jobject obj, js try { - rc = getHandle(env,obj)->connect(host,(time_t) seconds); + rc = java::getHandle(env,obj)->connect(host,(time_t) seconds); } catch(std::exception &e) { @@ -58,7 +60,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_disconnect(JNIEnv *env, jobject obj) try { - return (jint) getHandle(env,obj)->disconnect(); + return (jint) java::getHandle(env,obj)->disconnect(); } catch(std::exception &e) { diff --git a/src/java/cursor.cc b/src/java/cursor.cc index 272881e..2b75fc7 100644 --- a/src/java/cursor.cc +++ b/src/java/cursor.cc @@ -32,13 +32,15 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace PW3270_NAMESPACE; + JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1position(JNIEnv *env, jobject obj, jint row, jint col) { jint rc = -1; try { - rc = getHandle(env,obj)->set_cursor_position((int) row, (int) col); + rc = java::getHandle(env,obj)->set_cursor_position((int) row, (int) col); } catch(std::exception &e) { @@ -57,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1addr(JNIEnv *env, jobje try { - rc = getHandle(env,obj)->set_cursor_addr((int) addr); + rc = java::getHandle(env,obj)->set_cursor_addr((int) addr); } catch(std::exception &e) { @@ -77,7 +79,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1cursor_1addr(JNIEnv *env, jobje try { - rc = getHandle(env,obj)->get_cursor_addr(); + rc = java::getHandle(env,obj)->get_cursor_addr(); } catch(std::exception &e) { diff --git a/src/java/dialog.cc b/src/java/dialog.cc index 25bb662..5fe7e21 100644 --- a/src/java/dialog.cc +++ b/src/java/dialog.cc @@ -32,6 +32,8 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace PW3270_NAMESPACE; + JNIEXPORT jint JNICALL Java_pw3270_terminal_popup_1dialog(JNIEnv *env, jobject obj, jint id, jstring j_title, jstring j_message, jstring j_secondary) { const char * title = env->GetStringUTFChars(j_title, 0); @@ -41,7 +43,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_popup_1dialog(JNIEnv *env, jobject o try { - rc = (jint) getHandle(env,obj)->popup_dialog((LIB3270_NOTIFY) id, title, message, secondary); + rc = (jint) java::getHandle(env,obj)->popup_dialog((LIB3270_NOTIFY) id, title, message, secondary); } catch(std::exception &e) { @@ -70,7 +72,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_file_1chooser_1dialog(JNIEnv *env try { - str = getHandle(env,obj)->file_chooser_dialog((int) action, title, extension, filename); + str = java::getHandle(env,obj)->file_chooser_dialog((int) action, title, extension, filename); } catch(std::exception &e) { diff --git a/src/java/field.cc b/src/java/field.cc index 2b4415b..c6aed65 100644 --- a/src/java/field.cc +++ b/src/java/field.cc @@ -32,13 +32,15 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace PW3270_NAMESPACE; + JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1start (JNIEnv *env, jobject obj, jint baddr) { jint rc = -1; try { - rc = getHandle(env,obj)->get_field_start((int) baddr); + rc = java::getHandle(env,obj)->get_field_start((int) baddr); } catch(std::exception &e) { @@ -57,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1len (JNIEnv *env, jobjec try { - rc = getHandle(env,obj)->get_field_len((int) baddr); + rc = java::getHandle(env,obj)->get_field_len((int) baddr); } catch(std::exception &e) { @@ -76,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1next_1unprotected(JNIEnv *env, try { - rc = getHandle(env,obj)->get_next_unprotected((int) baddr); + rc = java::getHandle(env,obj)->get_next_unprotected((int) baddr); } catch(std::exception &e) { diff --git a/src/java/getset.cc b/src/java/getset.cc index 313f619..a16e676 100644 --- a/src/java/getset.cc +++ b/src/java/getset.cc @@ -32,6 +32,8 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace std; +using namespace PW3270_NAMESPACE; JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string(JNIEnv *env, jobject obj, jint baddr, jint len) { @@ -39,7 +41,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string(JNIEnv *env, jobject try { - str = getHandle(env,obj)->get_string((int) baddr, (int) len); + str = java::getHandle(env,obj)->get_string((int) baddr, (int) len); } catch(std::exception &e) { @@ -58,7 +60,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string_1at(JNIEnv *env, jobj try { - str = getHandle(env,obj)->get_string_at((int) row, (int) col, (int) sz); + str = java::getHandle(env,obj)->get_string_at((int) row, (int) col, (int) sz); } catch(std::exception &e) { @@ -78,7 +80,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1string_1at(JNIEnv *env, jobject try { - rc = getHandle(env,obj)->set_string_at((int) row, (int) col, str); + rc = java::getHandle(env,obj)->set_string_at((int) row, (int) col, str); } catch(std::exception &e) { @@ -101,7 +103,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_cmp_1string_1at(JNIEnv *env, jobject try { - rc = getHandle(env,obj)->cmp_string_at((int) row, (int) col, str); + rc = java::getHandle(env,obj)->cmp_string_at((int) row, (int) col, str); } catch(std::exception &e) { @@ -123,7 +125,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_input_1string(JNIEnv *env, jobject o try { - rc = getHandle(env,obj)->input_string(str); + rc = java::getHandle(env,obj)->input_string(str); } catch(std::exception &e) { @@ -144,7 +146,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1connected(JNIEnv *env, jobje try { - rc = getHandle(env,obj)->is_connected(); + rc = java::getHandle(env,obj)->is_connected(); } catch(std::exception &e) { @@ -164,7 +166,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1ready(JNIEnv *env, jobject o try { - rc = getHandle(env,obj)->is_ready(); + rc = java::getHandle(env,obj)->is_ready(); } catch(std::exception &e) { diff --git a/src/java/info.cc b/src/java/info.cc index 901e442..ff52b35 100644 --- a/src/java/info.cc +++ b/src/java/info.cc @@ -33,23 +33,25 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace PW3270_NAMESPACE; + JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1version (JNIEnv *env, jobject obj) { - session *s = getHandle(env,obj); + session *s = java::getHandle(env,obj); return env->NewStringUTF(s->get_version().c_str()); } JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1revision(JNIEnv *env, jobject obj) { - session *s = getHandle(env,obj); + session *s = java::getHandle(env,obj); return env->NewStringUTF(s->get_revision().c_str()); } JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1encoding(JNIEnv *env, jobject obj) { - session *s = getHandle(env,obj); + session *s = java::getHandle(env,obj); return env->NewStringUTF(s->get_encoding()); } diff --git a/src/java/keyboard.cc b/src/java/keyboard.cc index 98474a1..2be700b 100644 --- a/src/java/keyboard.cc +++ b/src/java/keyboard.cc @@ -32,13 +32,15 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace PW3270_NAMESPACE; + JNIEXPORT jint JNICALL Java_pw3270_terminal_enter(JNIEnv *env, jobject obj) { jint rc = -1; try { - rc = getHandle(env,obj)->enter(); + rc = java::getHandle(env,obj)->enter(); } catch(std::exception &e) { @@ -57,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pfkey(JNIEnv *env, jobject obj, jint try { - rc = getHandle(env,obj)->pfkey((int) key); + rc = java::getHandle(env,obj)->pfkey((int) key); } catch(std::exception &e) { @@ -76,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pakey(JNIEnv *env, jobject obj, jint try { - rc = getHandle(env,obj)->pakey((int) key); + rc = java::getHandle(env,obj)->pakey((int) key); } catch(std::exception &e) { diff --git a/src/java/main.cc b/src/java/main.cc index 3f72921..67fe8b0 100644 --- a/src/java/main.cc +++ b/src/java/main.cc @@ -32,22 +32,29 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ -void set_java_session_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)) { - trace("%s(%p)",__FUNCTION__,factory); - session::set_plugin(factory); -} +namespace PW3270_NAMESPACE { -static jfieldID getHandleField(JNIEnv *env, jobject obj) { - jclass c = env->GetObjectClass(obj); - // J is the type signature for long: - return env->GetFieldID(c, "nativeHandle", "J"); -} + void java::set_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)) { + trace("%s(%p)",__FUNCTION__,factory); + session::set_plugin(factory); + } + + jfieldID java::getHandleField(JNIEnv *env, jobject obj) { + jclass c = env->GetObjectClass(obj); + // J is the type signature for long: + return env->GetFieldID(c, "nativeHandle", "J"); + } + + session * java::getHandle(JNIEnv *env, jobject obj) { + jlong handle = env->GetLongField(obj, getHandleField(env, obj)); + return reinterpret_cast(handle); + } -session * getHandle(JNIEnv *env, jobject obj) { - jlong handle = env->GetLongField(obj, getHandleField(env, obj)); - return reinterpret_cast(handle); } +using namespace PW3270_NAMESPACE; +using namespace PW3270_NAMESPACE::java; + JNIEXPORT jint JNICALL Java_pw3270_terminal_init__(JNIEnv *env, jobject obj) { trace("%s",__FUNCTION__); diff --git a/src/java/plugin.cc b/src/java/plugin.cc index 88a8b69..532b6b9 100644 --- a/src/java/plugin.cc +++ b/src/java/plugin.cc @@ -70,6 +70,8 @@ /*--[ Plugin session object ]--------------------------------------------------------------------------------*/ + using namespace std; + class plugin : public PW3270_NAMESPACE::session { private: @@ -325,7 +327,7 @@ extern "C" { - session * factory(const char *name) { + PW3270_NAMESPACE::session * factory(const char *name) { debug("---> %s",__FUNCTION__); return new plugin(lib3270_get_default_session_handle()); } diff --git a/src/java/private.h b/src/java/private.h index 45084ed..cccb0e8 100644 --- a/src/java/private.h +++ b/src/java/private.h @@ -37,14 +37,47 @@ #include #include - using namespace PW3270_NAMESPACE; + #include + #include - PW3270_NAMESPACE::session * getHandle(JNIEnv *env, jobject obj); +#ifdef PW3270_PLUGIN + #include + #include +#endif // PW3270_PLUGIN + + namespace PW3270_NAMESPACE { + + namespace java { + + extern JavaVM * jvm; + extern JNIEnv * env; + + void set_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)); + + PW3270_NAMESPACE::session * getHandle(JNIEnv *env, jobject obj); + jfieldID getHandleField(JNIEnv *env, jobject obj); + + void lock(); + void unlock(); + bool trylock(); + +#ifdef PW3270_PLUGIN + void call(GtkWidget *widget, const char *filename); + void failed(GtkWidget *widget, const char *msg, const char *format, ...); +#endif // PW3270_PLUGIN + + + + + } + + + } extern "C" { - LIB3270_EXPORT void set_java_session_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)); - extern session * factory(const char *name); + LIB3270_EXPORT void set_java_session_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)); + extern PW3270_NAMESPACE::session * factory(const char *name); } diff --git a/src/java/startstop.cc b/src/java/startstop.cc index 828d0c5..8558b22 100644 --- a/src/java/startstop.cc +++ b/src/java/startstop.cc @@ -48,11 +48,6 @@ #include "private.h" - #include - #include - #include - #include - #include #include #include @@ -68,21 +63,15 @@ #if GTK_CHECK_VERSION(2,32,0) static GMutex mutex; - #define trylock() g_mutex_trylock(&mutex) - #define lock() g_mutex_lock(&mutex) - #define unlock() g_mutex_unlock(&mutex) - #else static GStaticMutex mutex = G_STATIC_MUTEX_INIT; - #define trylock() g_static_mutex_trylock(&mutex) - #define lock() g_static_mutex_lock(&mutex) - #define unlock() g_static_mutex_unlock(&mutex) - #endif // GTK_CHECK_VERSION /*---[ Implement ]----------------------------------------------------------------------------------*/ +using namespace PW3270_NAMESPACE::java; + extern "C" { static void trace_cleanup(GtkWidget *widget, GtkWidget **window) { @@ -123,118 +112,8 @@ extern "C" { return 0; } -} - -#ifdef _WIN32 - /* - * Dynamically load jvm to avoid naming and path problems - * - */ - static void load_jvm(GtkWidget *widget, HMODULE &hModule) { - - // Dynamically load jvm library to avoid naming and path problems. - HMODULE kernel; - HANDLE WINAPI (*AddDllDirectory)(PCWSTR NewDirectory); - BOOL WINAPI (*RemoveDllDirectory)(HANDLE Cookie); - - struct _dlldir { - const gchar * env; - const gchar * path; - HANDLE cookie; - } dlldir[] = { - { "JRE_HOME", "bin\\client", 0 }, - { "JDK_HOME", "jre\\bin\\client", 0 } - }; - - kernel = LoadLibrary("kernel32.dll"); - - debug("---[ %s ]---------------------------------------------------",__FUNCTION__); - - AddDllDirectory = (HANDLE WINAPI (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory"); - if(AddDllDirectory) { - - // Acrescenta mais caminhos para achar a dll - for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) { - - const char *env = getenv(dlldir[f].env); - - debug("%s=\"%s\"",dlldir[f].env,env); - - if(env) { - - gchar *p = g_build_filename(env,dlldir[f].path,NULL); - - debug("Adicionando diretório \"%s\"",p); - - wchar_t *path = (wchar_t *) malloc(4096*sizeof(wchar_t)); - mbstowcs(path, p, 4095); - dlldir[f].cookie = AddDllDirectory(path); - free(path); - - g_free(p); - - } - } - - } -#ifdef DEBUG - else { - debug("Can't get %s: %s","AddDllDirectory",session::win32_strerror(GetLastError()).c_str()) - } -#endif // DEBUG - - hModule = LoadLibrary("jvm.dll"); - - debug("hModule=%08lx",(long) hModule); - - if(!hModule) { - - DWORD err = GetLastError(); - - debug("%s",session::win32_strerror(err).c_str()); - - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CANCEL, - "%s", _( "Can't load java virtual machine" ) ); - - gtk_window_set_title(GTK_WINDOW(dialog),_( "JVM error" )); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s", session::win32_strerror(err).c_str()); - - gtk_dialog_run(GTK_DIALOG (dialog)); - gtk_widget_destroy(dialog); - - } - - // Libera caminhos extras. - RemoveDllDirectory = (BOOL WINAPI (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory"); - if(RemoveDllDirectory) { - - for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) { - - if(dlldir[f].cookie) { - - RemoveDllDirectory(dlldir[f].cookie); - - } - } - - } -#ifdef DEBUG - else { - debug("Can't get %s: %s","RemoveDllDirectory",session::win32_strerror(GetLastError()).c_str()) - } -#endif // DEBUG - - FreeLibrary(kernel); - } - -#endif // _WIN32 - - LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window) { trace("JAVA: %s",__FUNCTION__); @@ -247,292 +126,23 @@ extern "C" { LIB3270_EXPORT int pw3270_plugin_stop(GtkWidget *window) { -#if GTK_CHECK_VERSION(2,32,0) - g_mutex_clear(&mutex); -#endif // GTK_CHECK_VERSION - trace("JAVA: %s",__FUNCTION__); - return 0; - } - -extern "C" -{ - - void call_java_program(GtkAction *action, GtkWidget *widget, const gchar *filename) - { + lock(); - if(!trylock()) { - - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CANCEL, - _( "Can't start %s program" ), "java" ); - - gtk_window_set_title(GTK_WINDOW(dialog),_( "JVM busy" )); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),_( "%s interpreter is busy" ), "java"); - - gtk_dialog_run(GTK_DIALOG (dialog)); - gtk_widget_destroy(dialog); - - return; + if(jvm) { + jvm->DestroyJavaVM(); + jvm = NULL; } - v3270_set_script(widget,'J',TRUE); - -#ifdef _WIN32 - - HMODULE hJVM = 0; - - load_jvm(widget,hJVM); - - debug("hJVM=%p",hJVM); - - if(!hJVM) { - v3270_set_script(widget,'J',FALSE); + unlock(); #if GTK_CHECK_VERSION(2,32,0) - g_mutex_unlock(&mutex); -#else - g_static_mutex_unlock(&mutex); + g_mutex_clear(&mutex); #endif // GTK_CHECK_VERSION + trace("JAVA: %s",__FUNCTION__); - return; - - } - -#endif // _WIN32 - - debug("%s",__FUNCTION__); - - // Start JNI - JavaVMInitArgs vm_args; - JavaVMOption options[5]; - - JavaVM * jvm = NULL; - JNIEnv * env = NULL; - jint rc = 0; - - memset(&vm_args,0,sizeof(vm_args)); - memset(options,0,sizeof(options)); - - vm_args.version = JNI_VERSION_1_4; - vm_args.nOptions = 0; - vm_args.options = options; - vm_args.ignoreUnrecognized = JNI_FALSE; - - options[vm_args.nOptions].optionString = g_strdup("vfprintf"); - options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf; - vm_args.nOptions++; - -//#ifdef DEBUG -// options[vm_args.nOptions++].optionString = g_strdup("-verbose"); -//#endif - - gchar * dirname = g_path_get_dirname(filename); - - debug("Dirname=%s",dirname); - -#if defined( WIN32 ) - - gchar * exports = NULL; - char buffer[1024]; - gchar * myDir; - - if(GetModuleFileName(NULL,buffer,sizeof(buffer)) < sizeof(buffer)) { - - gchar * ptr = strrchr(buffer,G_DIR_SEPARATOR); - if(ptr) { - *ptr = 0; - myDir = g_strdup(buffer); - } else { - myDir = g_strdup("."); - } - - - } else { - - myDir = g_strdup("."); - - } - - debug("myDir=%s",myDir); - - exports = g_build_filename(myDir,"jvm-exports",NULL); - g_mkdir_with_parents(exports,0777); - - lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s;%s",dirname,exports); - lib3270_trace_event(v3270_get_session(widget),"java.library.path=%s",myDir); - - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",myDir); - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s;%s",dirname,exports); - - g_free(myDir); - g_free(exports); - - // Windows, first find the method, then call it. - jint JNICALL (*CreateJavaVM)(JavaVM **, void **, void *) = (jint JNICALL (*)(JavaVM **, void **, void *)) GetProcAddress(hJVM,"JNI_CreateJavaVM"); - - if(!CreateJavaVM) { - rc = ENOENT; - } else { - debug("Calling %s","CreateJavaVM"); - rc = CreateJavaVM(&jvm,(void **)&env,&vm_args); - debug("%s exits with rc=%d","CreateJavaVM",rc); - } - -#else - -#if defined(DEBUG) - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s:.bin/Debug:.bin/Debug/lib",JNIDIR); - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s:./src/java/.bin/java",JARDIR,dirname); -#else - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR); - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s",JARDIR,dirname); -#endif // JNIDIR - - // Linux, just create JVM - rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); - -#endif // _WIn32 - - debug("JNI_CreateJavaVM exits with rc=%d",rc); - - g_free(dirname); - - - // Release options - for(int f=0;fFindClass(classname); - - if(cls == 0) { - - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CANCEL, - _( "Can't find class %s" ), classname ); - - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) - gtk_main_quit(); - gtk_widget_destroy(dialog); - - } else { - - jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); - - if(mid == 0) { - - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK_CANCEL, - _( "Can't find class \"%s\"" ), classname ); - - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); - - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) - gtk_main_quit(); - gtk_widget_destroy(dialog); - - } else { - - jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), env->NewStringUTF("")); - - try { - - debug("%s: Calling CallStaticVoidMethod()",__FUNCTION__); - env->CallStaticVoidMethod(cls, mid, args); - debug("%s: CallStaticVoidMethod() has returned",__FUNCTION__); - - jthrowable exc = env->ExceptionOccurred(); - env->ExceptionClear(); - - if (exc) { - jclass throwable_class = env->FindClass("java/lang/Throwable"); - - jmethodID jni_getMessage = env->GetMethodID(throwable_class,"getMessage","()Ljava/lang/String;"); - jstring j_msg = (jstring) env->CallObjectMethod(exc,jni_getMessage); - - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK_CANCEL, - _( "Java application \"%s\" has failed." ), classname ); - - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java failure" )); - - if(!env->IsSameObject(j_msg,NULL)) { - - const char * msg = env->GetStringUTFChars(j_msg, 0); - - debug("jni_getMessage = %s",msg); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg); - - env->ReleaseStringUTFChars( j_msg, msg); - } - - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) - gtk_main_quit(); - gtk_widget_destroy(dialog); - - - } - - } catch(std::exception &e) { - - debug("Java error: %s",e.what()); - trace("%s",e.what()); - } - - - } - - } - - g_free(classname); - - rc = jvm->DestroyJavaVM(); - debug("DestroyJavaVM=%d",(int) rc); - } - -#ifdef _WIN32 - if(hJVM) - FreeLibrary(hJVM); -#endif // _WIN32 - - // And release - v3270_set_script(widget,'J',FALSE); - unlock(); + return 0; } LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) @@ -544,7 +154,7 @@ extern "C" if(filename) { // Has filename, call it directly - call_java_program(action,widget,filename); + call(widget,filename); } else { @@ -574,7 +184,7 @@ extern "C" if(filename) { - call_java_program(action,widget,filename); + call(widget,filename); g_free(filename); } @@ -583,5 +193,35 @@ extern "C" } -} + namespace PW3270_NAMESPACE { + + JavaVM * java::jvm = NULL; + JNIEnv * java::env = NULL; + + void java::lock() { +#if GTK_CHECK_VERSION(2,32,0) + g_mutex_lock(&mutex); +#else + g_static_mutex_lock(&mutex); +#endif // GTK_CHECK_VERSION + } + + void java::unlock() { +#if GTK_CHECK_VERSION(2,32,0) + g_mutex_unlock(&mutex); +#else + g_static_mutex_unlock(&mutex); +#endif // GTK_CHECK_VERSION + } + + bool java::trylock() { +#if GTK_CHECK_VERSION(2,32,0) + return g_mutex_trylock(&mutex); +#else + return g_static_mutex_trylock(&mutex); +#endif // GTK_CHECK_VERSION + } + + } + -- libgit2 0.21.2