Commit 7e3238e236706ed925b0b1928cbca22b8dfe912a
1 parent
a69872ea
Exists in
master
and in
5 other branches
Remodelando módulo java
Showing
3 changed files
with
118 additions
and
14 deletions
Show diff stats
src/java/call.cc
@@ -30,6 +30,7 @@ | @@ -30,6 +30,7 @@ | ||
30 | 30 | ||
31 | #include "private.h" | 31 | #include "private.h" |
32 | #include <pw3270/v3270.h> | 32 | #include <pw3270/v3270.h> |
33 | + #include <lib3270/trace.h> | ||
33 | 34 | ||
34 | 35 | ||
35 | /*---[ Implement ]----------------------------------------------------------------------------------*/ | 36 | /*---[ Implement ]----------------------------------------------------------------------------------*/ |
@@ -37,7 +38,7 @@ | @@ -37,7 +38,7 @@ | ||
37 | namespace PW3270_NAMESPACE { | 38 | namespace PW3270_NAMESPACE { |
38 | 39 | ||
39 | 40 | ||
40 | - void java::call(GtkWidget *widget, const char *filename) { | 41 | + void java::call(GtkWidget *widget, const char *classname) { |
41 | 42 | ||
42 | if(!trylock()) { | 43 | if(!trylock()) { |
43 | 44 | ||
@@ -49,6 +50,7 @@ namespace PW3270_NAMESPACE { | @@ -49,6 +50,7 @@ namespace PW3270_NAMESPACE { | ||
49 | if(jvm || load_jvm(widget)) { | 50 | if(jvm || load_jvm(widget)) { |
50 | 51 | ||
51 | v3270_set_script(widget,'J',TRUE); | 52 | v3270_set_script(widget,'J',TRUE); |
53 | +/* | ||
52 | 54 | ||
53 | gchar * dirname = g_path_get_dirname(filename); | 55 | gchar * dirname = g_path_get_dirname(filename); |
54 | gchar * classname = g_path_get_basename(filename); | 56 | gchar * classname = g_path_get_basename(filename); |
@@ -58,25 +60,108 @@ namespace PW3270_NAMESPACE { | @@ -58,25 +60,108 @@ namespace PW3270_NAMESPACE { | ||
58 | *ptr = 0; | 60 | *ptr = 0; |
59 | } | 61 | } |
60 | 62 | ||
63 | + gchar * classpath; | ||
64 | + | ||
65 | +#ifdef _WIN32 | ||
66 | + | ||
67 | + char buffer[1024]; | ||
68 | + gchar * exports; | ||
69 | + | ||
70 | + if(GetModuleFileName(NULL,buffer,sizeof(buffer)) < sizeof(buffer)) { | ||
71 | + | ||
72 | + gchar * ptr = strrchr(buffer,G_DIR_SEPARATOR); | ||
73 | + if(ptr) { | ||
74 | + *ptr = 0; | ||
75 | + exports = g_build_filename(buffer,"jvm-exports",NULL); | ||
76 | + } else { | ||
77 | + exports = g_build_filename(".","jvm-exports",NULL); | ||
78 | + } | ||
79 | + | ||
80 | + | ||
81 | + } else { | ||
82 | + | ||
83 | + exports = g_build_filename(".","jvm-exports",NULL); | ||
84 | + | ||
85 | + } | ||
86 | + | ||
87 | + debug("myDir=%s",myDir); | ||
88 | + | ||
89 | + g_mkdir_with_parents(exports,0777); | ||
90 | + | ||
91 | +#ifdef DEBUG | ||
92 | + classpath = g_strdup_printf("%s;%s;.bin/java",dirname,exports); | ||
93 | +#else | ||
94 | + classpath = g_strdup_printf("%s;%s",dirname,exports); | ||
95 | +#endif | ||
96 | + | ||
97 | + g_free(exports); | ||
98 | +#else | ||
99 | + | ||
100 | +#ifdef DEBUG | ||
101 | + classpath = g_strdup_printf("%s:%s:.bin/java",dirname,JARDIR); | ||
102 | +#else | ||
103 | + classpath = g_strdup_printf("%s:%s",dirname,JARDIR); | ||
104 | +#endif | ||
105 | + | ||
106 | +#endif // _WIN32 | ||
61 | 107 | ||
108 | +*/ | ||
62 | 109 | ||
63 | try { | 110 | try { |
64 | 111 | ||
65 | jclass cls; | 112 | jclass cls; |
66 | jmethodID mid; | 113 | jmethodID mid; |
67 | 114 | ||
115 | + /* | ||
116 | + | ||
117 | + DONT WORK!! | ||
118 | + http://stackoverflow.com/questions/271506/why-cant-system-setproperty-change-the-classpath-at-runtime | ||
119 | + | ||
68 | // Atualizar o classpath | 120 | // Atualizar o classpath |
69 | - cls = env->FindClass("java.lang.System"); | 121 | + cls = env->FindClass("java/lang/System"); |
122 | + if(!cls) { | ||
123 | + throw exception( _( "Can't find class %s" ), "java/lang/System"); | ||
124 | + } | ||
125 | + | ||
126 | + mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); | ||
127 | + if(!mid) { | ||
128 | + throw exception( _( "Can't find method %s/%s" ), "java/lang/System","setProperty"); | ||
129 | + } | ||
130 | + | ||
131 | + lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s\n",classpath); | ||
132 | + | ||
133 | + jstring name = env->NewStringUTF("java.class.path"); | ||
134 | + jstring path = env->NewStringUTF(classpath); | ||
135 | + | ||
136 | + jstring rc = (jstring) env->CallObjectMethod(cls,mid,name,path); | ||
137 | + | ||
138 | + env->DeleteLocalRef(name); | ||
139 | + env->DeleteLocalRef(path); | ||
140 | + env->DeleteLocalRef(rc); | ||
141 | + */ | ||
142 | + | ||
143 | + // Get application entry point. | ||
144 | + cls = env->FindClass(classname); | ||
70 | if(!cls) { | 145 | if(!cls) { |
71 | - throw exception( _( "Can't find class %s" ), "java.lang.System"); | 146 | + throw exception( _( "Can't find class %s" ), classname); |
72 | } | 147 | } |
73 | 148 | ||
74 | - mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String"); | 149 | + mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); |
75 | if(!mid) { | 150 | if(!mid) { |
76 | - throw exception( _( "Can't find method %s/%d" ), "java.lang.System","setProperty"); | 151 | + throw exception( _( "Can't find method %s/%s" ), classname, "main"); |
77 | } | 152 | } |
78 | 153 | ||
154 | + // Build arguments | ||
155 | + jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), env->NewStringUTF("")); | ||
79 | 156 | ||
157 | + // Call main() | ||
158 | + env->CallStaticVoidMethod(cls, mid, args); | ||
159 | + | ||
160 | + // Check for exception | ||
161 | + | ||
162 | + | ||
163 | + // And finish | ||
164 | + env->DeleteLocalRef(args); | ||
80 | 165 | ||
81 | } catch(std::exception &e) { | 166 | } catch(std::exception &e) { |
82 | 167 | ||
@@ -84,8 +169,11 @@ namespace PW3270_NAMESPACE { | @@ -84,8 +169,11 @@ namespace PW3270_NAMESPACE { | ||
84 | 169 | ||
85 | } | 170 | } |
86 | 171 | ||
172 | +/* | ||
87 | g_free(dirname); | 173 | g_free(dirname); |
88 | g_free(classname); | 174 | g_free(classname); |
175 | + g_free(classpath); | ||
176 | +*/ | ||
89 | 177 | ||
90 | v3270_set_script(widget,'J',FALSE); | 178 | v3270_set_script(widget,'J',FALSE); |
91 | 179 |
src/java/startstop.cc
@@ -104,18 +104,19 @@ extern "C" { | @@ -104,18 +104,19 @@ extern "C" { | ||
104 | 104 | ||
105 | LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) { | 105 | LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) { |
106 | 106 | ||
107 | - gchar *filename = (gchar *) g_object_get_data(G_OBJECT(action),"src"); | 107 | + gchar *classname = (gchar *) g_object_get_data(G_OBJECT(action),"src"); |
108 | 108 | ||
109 | - lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p",gtk_action_get_name(action),widget); | 109 | + lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p\n",gtk_action_get_name(action),widget); |
110 | 110 | ||
111 | - if(filename) | 111 | + if(classname) |
112 | { | 112 | { |
113 | // Has filename, call it directly | 113 | // Has filename, call it directly |
114 | - call(widget,filename); | 114 | + call(widget,classname); |
115 | } | 115 | } |
116 | else | 116 | else |
117 | { | 117 | { |
118 | - // No filename, ask user | 118 | +/* |
119 | + // No classname, ask user | ||
119 | static const struct _list | 120 | static const struct _list |
120 | { | 121 | { |
121 | const gchar *name; | 122 | const gchar *name; |
@@ -144,7 +145,7 @@ extern "C" { | @@ -144,7 +145,7 @@ extern "C" { | ||
144 | call(widget,filename); | 145 | call(widget,filename); |
145 | g_free(filename); | 146 | g_free(filename); |
146 | } | 147 | } |
147 | - | 148 | +*/ |
148 | } | 149 | } |
149 | 150 | ||
150 | } | 151 | } |
@@ -166,6 +167,17 @@ extern "C" { | @@ -166,6 +167,17 @@ extern "C" { | ||
166 | 167 | ||
167 | gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); | 168 | gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); |
168 | 169 | ||
170 | + if(format) { | ||
171 | + | ||
172 | + va_list arg_ptr; | ||
173 | + va_start(arg_ptr, format); | ||
174 | + gchar *msg = g_strdup_vprintf(format,arg_ptr); | ||
175 | + va_end(arg_ptr); | ||
176 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg); | ||
177 | + g_free(msg); | ||
178 | + | ||
179 | + } | ||
180 | + | ||
169 | if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) | 181 | if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) |
170 | gtk_main_quit(); | 182 | gtk_main_quit(); |
171 | gtk_widget_destroy(dialog); | 183 | gtk_widget_destroy(dialog); |
@@ -212,11 +224,13 @@ extern "C" { | @@ -212,11 +224,13 @@ extern "C" { | ||
212 | #if defined(DEBUG) | 224 | #if defined(DEBUG) |
213 | 225 | ||
214 | // options[vm_args.nOptions++].optionString = g_strdup("-verbose"); | 226 | // options[vm_args.nOptions++].optionString = g_strdup("-verbose"); |
215 | - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s:.bin/Debug:.bin/Debug/lib",JNIDIR); | 227 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=.bin/Debug:.bin/Debug/lib:%s",JNIDIR); |
228 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=./src/java:.bin/java:%s",JARDIR); | ||
216 | 229 | ||
217 | #else | 230 | #else |
218 | 231 | ||
219 | options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR); | 232 | options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR); |
233 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s",JARDIR); | ||
220 | 234 | ||
221 | #endif // JNIDIR | 235 | #endif // JNIDIR |
222 | 236 |
ui/80java.xml
@@ -34,8 +34,10 @@ | @@ -34,8 +34,10 @@ | ||
34 | <menu name='FileMenu' label='_File' /> | 34 | <menu name='FileMenu' label='_File' /> |
35 | <menu name='EditMenu' label='_Edit' /> | 35 | <menu name='EditMenu' label='_Edit' /> |
36 | <menu name='View' label='_View' /> | 36 | <menu name='View' label='_View' /> |
37 | - <menu name='ScriptsMenu' label='Scripts' visible='yes' > | ||
38 | - <menuitem action='java' label='External Java Application'/> | 37 | + <menu name='Java' label='Java' visible='yes' > |
38 | + <menuitem name='java_except' action='java' label='Exception test' src='except'/> | ||
39 | + <menuitem name='java_output' action='java' label='Output test' src='out'/> | ||
40 | + <menuitem name='java_popup' action='java' label='Popup test' src='popup'/> | ||
39 | </menu> | 41 | </menu> |
40 | </menubar> | 42 | </menubar> |
41 | </ui> | 43 | </ui> |