View | Details | Raw Unified | Return to bug 82518 | Differences between
and this patch

Collapse All | Expand All

(-)eclipseWin.c (+135 lines)
Lines 25-33 Link Here
25
/* Global Variables */
25
/* Global Variables */
26
_TCHAR   dirSeparator  = _T('\\');
26
_TCHAR   dirSeparator  = _T('\\');
27
_TCHAR   pathSeparator = _T(';');
27
_TCHAR   pathSeparator = _T(';');
28
#define JNI_INVOKE 1
29
#ifdef JNI_INVOKE
30
#include <jni.h>       /* java native interface */
31
_TCHAR*  consoleVM     = _T("jni.dll");
32
_TCHAR*  defaultVM     = _T("jni.dll");
33
_TCHAR*  shippedVMDir  = _T("jre\\bin\\client\\");
34
#else
28
_TCHAR*  consoleVM     = _T("java.exe");
35
_TCHAR*  consoleVM     = _T("java.exe");
29
_TCHAR*  defaultVM     = _T("javaw.exe");
36
_TCHAR*  defaultVM     = _T("javaw.exe");
30
_TCHAR*  shippedVMDir  = _T("jre\\bin\\");
37
_TCHAR*  shippedVMDir  = _T("jre\\bin\\");
38
#endif
31
39
32
/* Define the window system arguments for the Java VM. */
40
/* Define the window system arguments for the Java VM. */
33
static _TCHAR*  argVM[] = { NULL };
41
static _TCHAR*  argVM[] = { NULL };
Lines 162-167 Link Here
162
	return argVM;
170
	return argVM;
163
}
171
}
164
172
173
#ifdef JNI_INVOKE
174
static jstring newJavaString(JNIEnv *env, char *s)
175
{    
176
	int len;
177
	jclass cls;
178
	jmethodID mid;
179
	jbyteArray ary;
180
	jstring str = 0;
181
	
182
	if (s == NULL)
183
		return 0;
184
	len = strlen(s);
185
	ary = (*env)->NewByteArray(env, len);
186
	if (ary != 0)
187
	{
188
		(*env)->SetByteArrayRegion(env, ary, 0, len, (jbyte *)s);
189
		if (!(*env)->ExceptionOccurred(env)) {
190
			cls = (*env)->FindClass(env, "java/lang/String");
191
			mid = (*env)->GetMethodID(env, cls, "<init>",  "([B)V");
192
		    str = (*env)->NewObject(env, cls, mid, ary);
193
		}
194
		(*env)->DeleteLocalRef(env, ary);
195
	} 
196
	return str;
197
}
198
199
static jobjectArray newJavaStringArray(JNIEnv *env, char **argv, int argc)
200
{
201
    jarray cls;
202
    jarray ary;
203
    int i;
204
205
    cls = (*env)->FindClass(env, "java/lang/String");
206
    ary = (*env)->NewObjectArray(env, argc, cls, 0);
207
    for (i = 0; i < argc; i++) {
208
		jstring str = newJavaString(env, *argv++);
209
		(*env)->SetObjectArrayElement(env, ary, i, str);
210
		(*env)->DeleteLocalRef(env, str);
211
    }
212
    return ary;
213
}
214
#endif
165
215
166
/* Start the Java VM
216
/* Start the Java VM
167
 *
217
 *
Lines 170-175 Link Here
170
 */
220
 */
171
int startJavaVM( _TCHAR* args[] )
221
int startJavaVM( _TCHAR* args[] )
172
{
222
{
223
#ifdef JNI_INVOKE
224
	HINSTANCE jvmLibrary; // Library handle
225
	//displayMessage(_T("jni invoke\n"));
226
	jvmLibrary = LoadLibrary(args[0]);
227
	/* If the child library (JVM) would not start */
228
	if (jvmLibrary == 0)
229
	{
230
		/* Return the error number. */
231
		displayMessage(_T("child lib would not start\n"));
232
		jvmExitCode = errno;
233
		jvmLibrary  = 0;
234
	}
235
	else
236
	{
237
		/* Get the function addresses */
238
		jint (JNICALL *createJavaVM)(JavaVM **pvm, JNIEnv **env, void *args);
239
		jint (JNICALL *getDefaultJavaVMInitArgs)(void *args);
240
	    createJavaVM = (void *)GetProcAddress(jvmLibrary, "JNI_CreateJavaVM");
241
	    getDefaultJavaVMInitArgs = (void *)GetProcAddress(jvmLibrary, "JNI_GetDefaultJavaVMInitArgs");
242
	    if (createJavaVM == 0 || getDefaultJavaVMInitArgs == 0)
243
		{
244
			/* Return the error number. */
245
			displayMessage(_T("createJavaVM or getDefaultJavaVMInitArgs address not found\n"));
246
			jvmExitCode = errno;
247
			jvmLibrary  = 0;
248
		}
249
		else
250
		{
251
			JavaVM *jvm;       /* denotes a Java VM */
252
			JNIEnv *env;       /* pointer to native method interface */
253
			// documented here: http://java.sun.com/j2se/1.4.2/docs/guide/jni/jni-12.html#JNI_CreateJavaVM
254
			JavaVMInitArgs  vm_args = {0};
255
			JavaVMOption options[4];
256
			options[0].optionString = "-Djava.class.path=startup.jar";
257
			vm_args.version = JNI_VERSION_1_4;
258
			vm_args.options = options;
259
			vm_args.nOptions = 1;
260
			vm_args.ignoreUnrecognized = JNI_TRUE;
261
			
262
			/* load and initialize a Java VM, return a JNI interface pointer in env */
263
			//displayMessage(_T("about to create vm\n"));
264
			(*createJavaVM)(&jvm, &env, &vm_args);
265
			if (jvm == NULL)
266
			{
267
				displayMessage(_T("createJavaVM failed\n"));
268
				jvmExitCode = errno;
269
				jvmLibrary  = 0;
270
			}
271
			else
272
			{
273
				/* invoke the Main.test method using the JNI */
274
				//displayMessage(_T("about to FindClass\n"));
275
				jclass cls = (*env)->FindClass(env, "org/eclipse/core/launcher/Main");
276
				if (cls == NULL)
277
				{
278
					displayMessage(_T("FindClass failed\n"));
279
					jvmExitCode = errno;
280
					jvmLibrary  = 0;
281
				}
282
				else
283
				{
284
					//displayMessage(_T("about to GetStaticMethodID\n"));
285
					jmethodID mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
286
					if (mid == NULL)
287
					{
288
						displayMessage(_T("GetStaticMethodID failed\n"));
289
						jvmExitCode = errno;
290
						jvmLibrary  = 0;
291
					}
292
					else
293
					{
294
						//displayMessage(_T("about to call main\n"));
295
						(*env)->CallStaticVoidMethod(env, cls, mid,
296
							newJavaStringArray(env, NULL, 0));
297
						// shouldn't get here, but just in case...
298
						displayMessage(_T("main complete, destroying vm\n"));
299
						/* We are done. */
300
						(*jvm)->DestroyJavaVM(jvm);
301
					}
302
				}
303
			}
304
		}
305
	}
306
#else
173
    MSG   msg;
307
    MSG   msg;
174
	int   index, length;
308
	int   index, length;
175
	_TCHAR *commandLine, *ch, *space;
309
	_TCHAR *commandLine, *ch, *space;
Lines 244-249 Link Here
244
        KillTimer( topWindow, jvmExitTimerId );
378
        KillTimer( topWindow, jvmExitTimerId );
245
	}
379
	}
246
380
381
#endif
247
	/* Return the exit code from the JVM. */
382
	/* Return the exit code from the JVM. */
248
	return jvmExitCode;
383
	return jvmExitCode;
249
}
384
}

Return to bug 82518