Commit 7d4f2b4e853d2733b205eec8ecdfa3319ebaaf5e
1 parent
324ba943
Exists in
master
and in
5 other branches
Mudando carga da JVM para dinâmica em windows para evitar problemas de naminh e path
Showing
3 changed files
with
135 additions
and
2 deletions
Show diff stats
configure.ac
@@ -408,7 +408,8 @@ fi | @@ -408,7 +408,8 @@ fi | ||
408 | # Java link options depends on OS | 408 | # Java link options depends on OS |
409 | case "$host" in | 409 | case "$host" in |
410 | *-mingw32) | 410 | *-mingw32) |
411 | - jvm_libs="-L\"\$(JDK_HOME)/lib\" -ljvm" | 411 | +# jvm_libs="-L\"\$(JDK_HOME)/lib\" -ljvm" |
412 | + jvm_libs="-L\"\$(JRE_HOME)/bin/client\" -ljvm" | ||
412 | ;; | 413 | ;; |
413 | 414 | ||
414 | *-apple-*) | 415 | *-apple-*) |
src/java/jni3270.cbp
@@ -41,6 +41,7 @@ | @@ -41,6 +41,7 @@ | ||
41 | <Unit filename="../../configure.ac" /> | 41 | <Unit filename="../../configure.ac" /> |
42 | <Unit filename="../classlib/exception.cc" /> | 42 | <Unit filename="../classlib/exception.cc" /> |
43 | <Unit filename="../classlib/local.cc" /> | 43 | <Unit filename="../classlib/local.cc" /> |
44 | + <Unit filename="../classlib/module.cc" /> | ||
44 | <Unit filename="../classlib/remote.cc" /> | 45 | <Unit filename="../classlib/remote.cc" /> |
45 | <Unit filename="../classlib/session.cc" /> | 46 | <Unit filename="../classlib/session.cc" /> |
46 | <Unit filename="../classlib/testprogram.cc" /> | 47 | <Unit filename="../classlib/testprogram.cc" /> |
src/java/plugin.cc
@@ -27,6 +27,21 @@ | @@ -27,6 +27,21 @@ | ||
27 | * | 27 | * |
28 | */ | 28 | */ |
29 | 29 | ||
30 | +#if defined WIN32 | ||
31 | + | ||
32 | + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx | ||
33 | + #ifndef LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | ||
34 | + #define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000 | ||
35 | + #endif // LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | ||
36 | + | ||
37 | + #ifndef LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | ||
38 | + #define LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 0x00000100 | ||
39 | + #endif // LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | ||
40 | + | ||
41 | + #include <windows.h> | ||
42 | + | ||
43 | +#endif | ||
44 | + | ||
30 | #include "private.h" | 45 | #include "private.h" |
31 | 46 | ||
32 | #include <libintl.h> | 47 | #include <libintl.h> |
@@ -322,6 +337,87 @@ extern "C" { | @@ -322,6 +337,87 @@ extern "C" { | ||
322 | 337 | ||
323 | } | 338 | } |
324 | 339 | ||
340 | +#ifdef _WIN32 | ||
341 | + /* | ||
342 | + * Dynamically load jvm to avoid naming and path problems | ||
343 | + * | ||
344 | + */ | ||
345 | + static void load_jvm(GtkWidget *widget, HMODULE &hModule) { | ||
346 | + | ||
347 | + // Dynamically load jvm library to avoid naming and path problems. | ||
348 | + HMODULE kernel; | ||
349 | + HANDLE WINAPI (*AddDllDirectory)(PCWSTR NewDirectory); | ||
350 | + BOOL WINAPI (*RemoveDllDirectory)(HANDLE Cookie); | ||
351 | + | ||
352 | + struct _dlldir { | ||
353 | + const gchar * env; | ||
354 | + const gchar * path; | ||
355 | + HANDLE cookie; | ||
356 | + } dlldir[] = { | ||
357 | + { "JRE_HOME", "bin\\client", 0 }, | ||
358 | + { "JDK_HOME", "jre\\bin\\client", 0 } | ||
359 | + }; | ||
360 | + | ||
361 | + kernel = LoadLibrary("kernel32.dll"); | ||
362 | + AddDllDirectory = (HANDLE WINAPI (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory"); | ||
363 | + RemoveDllDirectory = (BOOL WINAPI (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory"); | ||
364 | + | ||
365 | + // Acrescenta mais caminhos para achar a dll | ||
366 | + for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) { | ||
367 | + | ||
368 | + const char *env = getenv(dlldir[f].env); | ||
369 | + if(env && AddDllDirectory) { | ||
370 | + | ||
371 | + gchar *p = g_build_filename(env,dlldir[f].path,NULL); | ||
372 | + | ||
373 | + debug("Adicionando diretório \"%s\"",p); | ||
374 | + | ||
375 | + wchar_t *path = (wchar_t *) malloc(4096*sizeof(wchar_t)); | ||
376 | + mbstowcs(path, p, 4095); | ||
377 | + dlldir[f].cookie = AddDllDirectory(path); | ||
378 | + free(path); | ||
379 | + | ||
380 | + g_free(p); | ||
381 | + | ||
382 | + } | ||
383 | + } | ||
384 | + | ||
385 | + hModule = LoadLibrary("jvm.dll"); | ||
386 | + | ||
387 | + if(!hModule) { | ||
388 | + | ||
389 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | ||
390 | + GTK_DIALOG_DESTROY_WITH_PARENT, | ||
391 | + GTK_MESSAGE_ERROR, | ||
392 | + GTK_BUTTONS_CANCEL, | ||
393 | + "%s", _( "Can't load java virtual machine" ) ); | ||
394 | + | ||
395 | + gtk_window_set_title(GTK_WINDOW(dialog),_( "JVM error" )); | ||
396 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s", session::win32_strerror(GetLastError()).c_str()); | ||
397 | + | ||
398 | + gtk_dialog_run(GTK_DIALOG (dialog)); | ||
399 | + gtk_widget_destroy(dialog); | ||
400 | + | ||
401 | + } | ||
402 | + | ||
403 | + // Libera caminhos extras. | ||
404 | + for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) { | ||
405 | + | ||
406 | + if(dlldir[f].cookie && RemoveDllDirectory) { | ||
407 | + | ||
408 | + RemoveDllDirectory(dlldir[f].cookie); | ||
409 | + | ||
410 | + } | ||
411 | + } | ||
412 | + | ||
413 | + FreeLibrary(kernel); | ||
414 | + | ||
415 | + | ||
416 | + } | ||
417 | + | ||
418 | + | ||
419 | +#endif // _WIN32 | ||
420 | + | ||
325 | 421 | ||
326 | LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window) | 422 | LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window) |
327 | { | 423 | { |
@@ -371,6 +467,28 @@ extern "C" | @@ -371,6 +467,28 @@ extern "C" | ||
371 | 467 | ||
372 | v3270_set_script(widget,'J',TRUE); | 468 | v3270_set_script(widget,'J',TRUE); |
373 | 469 | ||
470 | +#ifdef _WIN32 | ||
471 | + | ||
472 | + HMODULE hJVM = 0; | ||
473 | + | ||
474 | + load_jvm(widget,hJVM); | ||
475 | + | ||
476 | + if(!hJVM) { | ||
477 | + v3270_set_script(widget,'J',FALSE); | ||
478 | + | ||
479 | +#if GTK_CHECK_VERSION(2,32,0) | ||
480 | + g_mutex_unlock(&mutex); | ||
481 | +#else | ||
482 | + g_static_mutex_unlock(&mutex); | ||
483 | +#endif // GTK_CHECK_VERSION | ||
484 | + | ||
485 | + return; | ||
486 | + | ||
487 | + } | ||
488 | + | ||
489 | +#endif // _WIN32 | ||
490 | + | ||
491 | + | ||
374 | // Start JNI | 492 | // Start JNI |
375 | JavaVMInitArgs vm_args; | 493 | JavaVMInitArgs vm_args; |
376 | JavaVMOption options[5]; | 494 | JavaVMOption options[5]; |
@@ -426,7 +544,14 @@ extern "C" | @@ -426,7 +544,14 @@ extern "C" | ||
426 | g_free(myDir); | 544 | g_free(myDir); |
427 | g_free(exports); | 545 | g_free(exports); |
428 | 546 | ||
429 | - rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); | 547 | + // Windows, first find the method, then call it. |
548 | + jint JNICALL (*CreateJavaVM)(JavaVM **, void **, void *) = (jint JNICALL (*)(JavaVM **, void **, void *)) GetProcAddress(hJVM,"JNI_CreateJavaVM"); | ||
549 | + | ||
550 | + if(!CreateJavaVM) { | ||
551 | + rc = ENOENT; | ||
552 | + } else { | ||
553 | + rc = CreateJavaVM(&jvm,(void **)&env,&vm_args); | ||
554 | + } | ||
430 | 555 | ||
431 | #else | 556 | #else |
432 | 557 | ||
@@ -438,6 +563,7 @@ extern "C" | @@ -438,6 +563,7 @@ extern "C" | ||
438 | options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s",JARDIR,dirname); | 563 | options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s",JARDIR,dirname); |
439 | #endif // JNIDIR | 564 | #endif // JNIDIR |
440 | 565 | ||
566 | + // Linux, just create JVM | ||
441 | rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); | 567 | rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); |
442 | 568 | ||
443 | #endif // _WIn32 | 569 | #endif // _WIn32 |
@@ -532,6 +658,11 @@ extern "C" | @@ -532,6 +658,11 @@ extern "C" | ||
532 | jvm->DestroyJavaVM(); | 658 | jvm->DestroyJavaVM(); |
533 | } | 659 | } |
534 | 660 | ||
661 | +#ifdef _WIN32 | ||
662 | + if(hJVM) | ||
663 | + FreeLibrary(hJVM); | ||
664 | +#endif // _WIN32 | ||
665 | + | ||
535 | // And release | 666 | // And release |
536 | v3270_set_script(widget,'J',FALSE); | 667 | v3270_set_script(widget,'J',FALSE); |
537 | 668 |