Commit 6d7b28522c0a4e1b02152f4689e41e1314acf3db
1 parent
a78dd248
Exists in
master
and in
5 other branches
Implementando plugin e extensão java para windows
Showing
3 changed files
with
165 additions
and
6 deletions
Show diff stats
src/java/Makefile.in
| ... | ... | @@ -86,7 +86,7 @@ PW3270_CFLAGS ?= -I../include |
| 86 | 86 | PLUGIN_CFLAGS=@CXXFLAGS@ -DPW3270_PLUGIN -Wno-deprecated-declarations @DLL_CFLAGS@ @JNI_CPPFLAGS@ -DJNIDIR="\"$(jnidir)\"" \ |
| 87 | 87 | -DJARDIR="\"$(jvmjardir)\"" @GTK_CFLAGS@ @GTKMAC_CFLAGS@ $(PW3270_CFLAGS) |
| 88 | 88 | |
| 89 | -PLUGIN_LIBS=@GTK_LIBS@ @GTKMAC_LIBS@ @JVM_LIBS@ | |
| 89 | +PLUGIN_LIBS=@GTK_LIBS@ @GTKMAC_LIBS@ @INTL_LIBS@ @JVM_LIBS@ | |
| 90 | 90 | |
| 91 | 91 | #---[ Rules ]------------------------------------------------------------------ |
| 92 | 92 | |
| ... | ... | @@ -190,7 +190,7 @@ $(BINRLS)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@: \ |
| 190 | 190 | |
| 191 | 191 | @echo " LD `basename $@`" |
| 192 | 192 | @$(MKDIR) `dirname $@` |
| 193 | - @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) | |
| 193 | + @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) @INTL_LIBS@ | |
| 194 | 194 | |
| 195 | 195 | $(BINRLS)/plugins/j3270@DLLEXT@: \ |
| 196 | 196 | $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/j3270/$(SRC)@OBJEXT@) \ |
| ... | ... | @@ -218,7 +218,7 @@ $(BINDBG)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@: \ |
| 218 | 218 | |
| 219 | 219 | @echo " LD `basename $@`" |
| 220 | 220 | @$(MKDIR) `dirname $@` |
| 221 | - @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) | |
| 221 | + @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) @INTL_LIBS@ | |
| 222 | 222 | |
| 223 | 223 | $(BINDBG)/plugins/j3270@DLLEXT@: \ |
| 224 | 224 | $(BINDBG)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@ \ | ... | ... |
src/java/private.h
src/java/startstop.cc
| ... | ... | @@ -154,8 +154,11 @@ extern "C" { |
| 154 | 154 | |
| 155 | 155 | namespace PW3270_NAMESPACE { |
| 156 | 156 | |
| 157 | - JavaVM * java::jvm = NULL; | |
| 158 | - JNIEnv * java::env = NULL; | |
| 157 | + JavaVM * java::jvm = NULL; | |
| 158 | + JNIEnv * java::env = NULL; | |
| 159 | +#ifdef _WIN32 | |
| 160 | + HMODULE java::hModule = NULL; | |
| 161 | +#endif // _WIN32 | |
| 159 | 162 | |
| 160 | 163 | void java::failed(GtkWidget *widget, const char *msg, const char *format, ...) { |
| 161 | 164 | |
| ... | ... | @@ -189,7 +192,159 @@ extern "C" { |
| 189 | 192 | |
| 190 | 193 | bool java::load_jvm(GtkWidget *widget) { |
| 191 | 194 | |
| 192 | - #error Implementar | |
| 195 | + if(jvm != NULL) { | |
| 196 | + return true; | |
| 197 | + } | |
| 198 | + | |
| 199 | + // Dynamically load jvm library to avoid naming and path problems. | |
| 200 | + HMODULE kernel; | |
| 201 | + HANDLE WINAPI (*AddDllDirectory)(PCWSTR NewDirectory); | |
| 202 | + BOOL WINAPI (*RemoveDllDirectory)(HANDLE Cookie); | |
| 203 | + | |
| 204 | + struct _dlldir { | |
| 205 | + const gchar * env; | |
| 206 | + const gchar * path; | |
| 207 | + HANDLE cookie; | |
| 208 | + } dlldir[] = { | |
| 209 | + { "JRE_HOME", "bin\\client", 0 }, | |
| 210 | + { "JDK_HOME", "jre\\bin\\client", 0 } | |
| 211 | + }; | |
| 212 | + | |
| 213 | + kernel = LoadLibrary("kernel32.dll"); | |
| 214 | + | |
| 215 | + AddDllDirectory = (HANDLE WINAPI (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory"); | |
| 216 | + if(AddDllDirectory) { | |
| 217 | + | |
| 218 | + // Acrescenta mais caminhos para achar a dll | |
| 219 | + for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) { | |
| 220 | + | |
| 221 | + const char *env = getenv(dlldir[f].env); | |
| 222 | + | |
| 223 | + debug("%s=\"%s\"",dlldir[f].env,env); | |
| 224 | + | |
| 225 | + if(env) { | |
| 226 | + | |
| 227 | + gchar *p = g_build_filename(env,dlldir[f].path,NULL); | |
| 228 | + | |
| 229 | + debug("Adicionando diretório \"%s\"",p); | |
| 230 | + | |
| 231 | + wchar_t *path = (wchar_t *) malloc(4096*sizeof(wchar_t)); | |
| 232 | + mbstowcs(path, p, 4095); | |
| 233 | + dlldir[f].cookie = AddDllDirectory(path); | |
| 234 | + free(path); | |
| 235 | + | |
| 236 | + g_free(p); | |
| 237 | + | |
| 238 | + } | |
| 239 | + } | |
| 240 | + | |
| 241 | + } | |
| 242 | + #ifdef DEBUG | |
| 243 | + else { | |
| 244 | + debug("Can't get %s: %s","AddDllDirectory",session::win32_strerror(GetLastError()).c_str()) | |
| 245 | + } | |
| 246 | + #endif // DEBUG | |
| 247 | + | |
| 248 | + hModule = LoadLibrary("jvm.dll"); | |
| 249 | + | |
| 250 | + if(hModule) { | |
| 251 | + failed(widget, _( "Can't load java virtual machine" ), "%s", session::win32_strerror(GetLastError()).c_str()); | |
| 252 | + } | |
| 253 | + | |
| 254 | + RemoveDllDirectory = (BOOL WINAPI (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory"); | |
| 255 | + if(RemoveDllDirectory) { | |
| 256 | + | |
| 257 | + for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) { | |
| 258 | + | |
| 259 | + if(dlldir[f].cookie) { | |
| 260 | + | |
| 261 | + RemoveDllDirectory(dlldir[f].cookie); | |
| 262 | + | |
| 263 | + } | |
| 264 | + } | |
| 265 | + | |
| 266 | + } | |
| 267 | + | |
| 268 | + FreeLibrary(kernel); | |
| 269 | + | |
| 270 | + if(!hModule) { | |
| 271 | + return false; | |
| 272 | + } | |
| 273 | + | |
| 274 | + // Consegui carregar a JVM, obtenho o método de controle | |
| 275 | + jint JNICALL (*CreateJavaVM)(JavaVM **, void **, void *) = (jint JNICALL (*)(JavaVM **, void **, void *)) GetProcAddress(hModule,"JNI_CreateJavaVM"); | |
| 276 | + | |
| 277 | + if(!CreateJavaVM) { | |
| 278 | + failed(widget, _( "Can't load java virtual machine creation method" ), "%s", session::win32_strerror(GetLastError()).c_str()); | |
| 279 | + return false; | |
| 280 | + } | |
| 281 | + | |
| 282 | + // Crio a JVM | |
| 283 | + JavaVMInitArgs vm_args; | |
| 284 | + JavaVMOption options[5]; | |
| 285 | + | |
| 286 | + jint rc = 0; | |
| 287 | + | |
| 288 | + memset(&vm_args,0,sizeof(vm_args)); | |
| 289 | + memset(options,0,sizeof(options)); | |
| 290 | + | |
| 291 | + vm_args.version = JNI_VERSION_1_4; | |
| 292 | + vm_args.nOptions = 0; | |
| 293 | + vm_args.options = options; | |
| 294 | + vm_args.ignoreUnrecognized = JNI_FALSE; | |
| 295 | + | |
| 296 | + options[vm_args.nOptions].optionString = g_strdup("vfprintf"); | |
| 297 | + options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf; | |
| 298 | + vm_args.nOptions++; | |
| 299 | + | |
| 300 | + gchar * exports = NULL; | |
| 301 | + char buffer[1024]; | |
| 302 | + gchar * myDir; | |
| 303 | + | |
| 304 | + if(GetModuleFileName(NULL,buffer,sizeof(buffer)) < sizeof(buffer)) { | |
| 305 | + | |
| 306 | + gchar * ptr = strrchr(buffer,G_DIR_SEPARATOR); | |
| 307 | + if(ptr) { | |
| 308 | + *ptr = 0; | |
| 309 | + myDir = g_strdup(buffer); | |
| 310 | + } else { | |
| 311 | + myDir = g_strdup("."); | |
| 312 | + } | |
| 313 | + | |
| 314 | + | |
| 315 | + } else { | |
| 316 | + | |
| 317 | + myDir = g_strdup("."); | |
| 318 | + | |
| 319 | + } | |
| 320 | + | |
| 321 | + debug("myDir=%s",myDir); | |
| 322 | + | |
| 323 | + exports = g_build_filename(myDir,"jvm-exports",NULL); | |
| 324 | + g_mkdir_with_parents(exports,0777); | |
| 325 | + | |
| 326 | + lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s",exports); | |
| 327 | + lib3270_trace_event(v3270_get_session(widget),"java.library.path=%s",myDir); | |
| 328 | + | |
| 329 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s",exports); | |
| 330 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",myDir); | |
| 331 | + | |
| 332 | + g_free(myDir); | |
| 333 | + g_free(exports); | |
| 334 | + | |
| 335 | + rc = CreateJavaVM(&jvm,(void **)&env,&vm_args); | |
| 336 | + if(rc < 0) { | |
| 337 | + failed(widget, _( "Can't create java VM" ), _( "The error code was %d" ), (int) rc); | |
| 338 | + jvm = NULL; | |
| 339 | + } | |
| 340 | + | |
| 341 | + for(int f=0;f<vm_args.nOptions;f++) { | |
| 342 | + trace("Releasing option %d: %s",f,options[f].optionString); | |
| 343 | + g_free(options[f].optionString); | |
| 344 | + } | |
| 345 | + | |
| 346 | + | |
| 347 | + return jvm != NULL; | |
| 193 | 348 | |
| 194 | 349 | } |
| 195 | 350 | ... | ... |