|
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 |
} |