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 | 408 | # Java link options depends on OS |
| 409 | 409 | case "$host" in |
| 410 | 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 | 415 | *-apple-*) | ... | ... |
src/java/jni3270.cbp
| ... | ... | @@ -41,6 +41,7 @@ |
| 41 | 41 | <Unit filename="../../configure.ac" /> |
| 42 | 42 | <Unit filename="../classlib/exception.cc" /> |
| 43 | 43 | <Unit filename="../classlib/local.cc" /> |
| 44 | + <Unit filename="../classlib/module.cc" /> | |
| 44 | 45 | <Unit filename="../classlib/remote.cc" /> |
| 45 | 46 | <Unit filename="../classlib/session.cc" /> |
| 46 | 47 | <Unit filename="../classlib/testprogram.cc" /> | ... | ... |
src/java/plugin.cc
| ... | ... | @@ -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 | 45 | #include "private.h" |
| 31 | 46 | |
| 32 | 47 | #include <libintl.h> |
| ... | ... | @@ -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 | 422 | LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window) |
| 327 | 423 | { |
| ... | ... | @@ -371,6 +467,28 @@ extern "C" |
| 371 | 467 | |
| 372 | 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 | 492 | // Start JNI |
| 375 | 493 | JavaVMInitArgs vm_args; |
| 376 | 494 | JavaVMOption options[5]; |
| ... | ... | @@ -426,7 +544,14 @@ extern "C" |
| 426 | 544 | g_free(myDir); |
| 427 | 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 | 556 | #else |
| 432 | 557 | |
| ... | ... | @@ -438,6 +563,7 @@ extern "C" |
| 438 | 563 | options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s",JARDIR,dirname); |
| 439 | 564 | #endif // JNIDIR |
| 440 | 565 | |
| 566 | + // Linux, just create JVM | |
| 441 | 567 | rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); |
| 442 | 568 | |
| 443 | 569 | #endif // _WIn32 |
| ... | ... | @@ -532,6 +658,11 @@ extern "C" |
| 532 | 658 | jvm->DestroyJavaVM(); |
| 533 | 659 | } |
| 534 | 660 | |
| 661 | +#ifdef _WIN32 | |
| 662 | + if(hJVM) | |
| 663 | + FreeLibrary(hJVM); | |
| 664 | +#endif // _WIN32 | |
| 665 | + | |
| 535 | 666 | // And release |
| 536 | 667 | v3270_set_script(widget,'J',FALSE); |
| 537 | 668 | ... | ... |