1216 /*
1217 * Loads a class and verifies that the main class is present and it is ok to
1218 * call it for more details refer to the java implementation.
1219 */
1220 static jclass
1221 LoadMainClass(JNIEnv *env, int mode, char *name)
1222 {
1223 jmethodID mid;
1224 jstring str;
1225 jobject result;
1226 jlong start, end;
1227 jclass cls = GetLauncherHelperClass(env);
1228 NULL_CHECK0(cls);
1229 if (JLI_IsTraceLauncher()) {
1230 start = CounterGet();
1231 }
1232 NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
1233 "checkAndLoadMain",
1234 "(ZILjava/lang/String;)Ljava/lang/Class;"));
1235
1236 str = NewPlatformString(env, name);
1237 result = (*env)->CallStaticObjectMethod(env, cls, mid, USE_STDERR, mode, str);
1238
1239 if (JLI_IsTraceLauncher()) {
1240 end = CounterGet();
1241 printf("%ld micro seconds to load main class\n",
1242 (long)(jint)Counter2Micros(end-start));
1243 printf("----%s----\n", JLDEBUG_ENV_ENTRY);
1244 }
1245
1246 return (jclass)result;
1247 }
1248
1249 static jclass
1250 GetApplicationClass(JNIEnv *env)
1251 {
1252 jmethodID mid;
1253 jobject result;
1254 jclass cls = GetLauncherHelperClass(env);
1255 NULL_CHECK0(cls);
1256 NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
1504 if (doXUsage) {
1505 NULL_CHECK(printXUsageMessage = (*env)->GetStaticMethodID(env, cls,
1506 "printXUsageMessage", "(Z)V"));
1507 (*env)->CallStaticVoidMethod(env, cls, printXUsageMessage, USE_STDERR);
1508 } else {
1509 NULL_CHECK(initHelp = (*env)->GetStaticMethodID(env, cls,
1510 "initHelpMessage", "(Ljava/lang/String;)V"));
1511
1512 NULL_CHECK(vmSelect = (*env)->GetStaticMethodID(env, cls, "appendVmSelectMessage",
1513 "(Ljava/lang/String;Ljava/lang/String;)V"));
1514
1515 NULL_CHECK(vmSynonym = (*env)->GetStaticMethodID(env, cls,
1516 "appendVmSynonymMessage",
1517 "(Ljava/lang/String;Ljava/lang/String;)V"));
1518 NULL_CHECK(vmErgo = (*env)->GetStaticMethodID(env, cls,
1519 "appendVmErgoMessage", "(ZLjava/lang/String;)V"));
1520
1521 NULL_CHECK(printHelp = (*env)->GetStaticMethodID(env, cls,
1522 "printHelpMessage", "(Z)V"));
1523
1524 jprogname = (*env)->NewStringUTF(env, _program_name);
1525
1526 /* Initialize the usage message with the usual preamble */
1527 (*env)->CallStaticVoidMethod(env, cls, initHelp, jprogname);
1528
1529
1530 /* Assemble the other variant part of the usage */
1531 if ((knownVMs[0].flag == VM_KNOWN) ||
1532 (knownVMs[0].flag == VM_IF_SERVER_CLASS)) {
1533 vm1 = (*env)->NewStringUTF(env, knownVMs[0].name);
1534 vm2 = (*env)->NewStringUTF(env, knownVMs[0].name+1);
1535 (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2);
1536 }
1537 for (i=1; i<knownVMsCount; i++) {
1538 if (knownVMs[i].flag == VM_KNOWN) {
1539 vm1 = (*env)->NewStringUTF(env, knownVMs[i].name);
1540 vm2 = (*env)->NewStringUTF(env, knownVMs[i].name+1);
1541 (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2);
1542 }
1543 }
1544 for (i=1; i<knownVMsCount; i++) {
1545 if (knownVMs[i].flag == VM_ALIASED_TO) {
1546 vm1 = (*env)->NewStringUTF(env, knownVMs[i].name);
1547 vm2 = (*env)->NewStringUTF(env, knownVMs[i].alias+1);
1548 (*env)->CallStaticVoidMethod(env, cls, vmSynonym, vm1, vm2);
1549 }
1550 }
1551
1552 /* The first known VM is the default */
1553 {
1554 jboolean isServerClassMachine = ServerClassMachine();
1555
1556 const char* defaultVM = knownVMs[0].name+1;
1557 if ((knownVMs[0].flag == VM_IF_SERVER_CLASS) && isServerClassMachine) {
1558 defaultVM = knownVMs[0].server_class+1;
1559 }
1560
1561 vm1 = (*env)->NewStringUTF(env, defaultVM);
1562 (*env)->CallStaticVoidMethod(env, cls, vmErgo, isServerClassMachine, vm1);
1563 }
1564
1565 /* Complete the usage message and print to stderr*/
1566 (*env)->CallStaticVoidMethod(env, cls, printHelp, USE_STDERR);
1567 }
1568 return;
1569 }
1570
1571 /*
1572 * Read the jvm.cfg file and fill the knownJVMs[] array.
1573 *
1574 * The functionality of the jvm.cfg file is subject to change without
1575 * notice and the mechanism will be removed in the future.
1576 *
1577 * The lexical structure of the jvm.cfg file is as follows:
1578 *
1579 * jvmcfg := { vmLine }
1580 * vmLine := knownLine
1581 * | aliasLine
|
1216 /*
1217 * Loads a class and verifies that the main class is present and it is ok to
1218 * call it for more details refer to the java implementation.
1219 */
1220 static jclass
1221 LoadMainClass(JNIEnv *env, int mode, char *name)
1222 {
1223 jmethodID mid;
1224 jstring str;
1225 jobject result;
1226 jlong start, end;
1227 jclass cls = GetLauncherHelperClass(env);
1228 NULL_CHECK0(cls);
1229 if (JLI_IsTraceLauncher()) {
1230 start = CounterGet();
1231 }
1232 NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
1233 "checkAndLoadMain",
1234 "(ZILjava/lang/String;)Ljava/lang/Class;"));
1235
1236 NULL_CHECK0(str = NewPlatformString(env, name));
1237 result = (*env)->CallStaticObjectMethod(env, cls, mid, USE_STDERR, mode, str);
1238
1239 if (JLI_IsTraceLauncher()) {
1240 end = CounterGet();
1241 printf("%ld micro seconds to load main class\n",
1242 (long)(jint)Counter2Micros(end-start));
1243 printf("----%s----\n", JLDEBUG_ENV_ENTRY);
1244 }
1245
1246 return (jclass)result;
1247 }
1248
1249 static jclass
1250 GetApplicationClass(JNIEnv *env)
1251 {
1252 jmethodID mid;
1253 jobject result;
1254 jclass cls = GetLauncherHelperClass(env);
1255 NULL_CHECK0(cls);
1256 NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
1504 if (doXUsage) {
1505 NULL_CHECK(printXUsageMessage = (*env)->GetStaticMethodID(env, cls,
1506 "printXUsageMessage", "(Z)V"));
1507 (*env)->CallStaticVoidMethod(env, cls, printXUsageMessage, USE_STDERR);
1508 } else {
1509 NULL_CHECK(initHelp = (*env)->GetStaticMethodID(env, cls,
1510 "initHelpMessage", "(Ljava/lang/String;)V"));
1511
1512 NULL_CHECK(vmSelect = (*env)->GetStaticMethodID(env, cls, "appendVmSelectMessage",
1513 "(Ljava/lang/String;Ljava/lang/String;)V"));
1514
1515 NULL_CHECK(vmSynonym = (*env)->GetStaticMethodID(env, cls,
1516 "appendVmSynonymMessage",
1517 "(Ljava/lang/String;Ljava/lang/String;)V"));
1518 NULL_CHECK(vmErgo = (*env)->GetStaticMethodID(env, cls,
1519 "appendVmErgoMessage", "(ZLjava/lang/String;)V"));
1520
1521 NULL_CHECK(printHelp = (*env)->GetStaticMethodID(env, cls,
1522 "printHelpMessage", "(Z)V"));
1523
1524 NULL_CHECK(jprogname = (*env)->NewStringUTF(env, _program_name));
1525
1526 /* Initialize the usage message with the usual preamble */
1527 (*env)->CallStaticVoidMethod(env, cls, initHelp, jprogname);
1528
1529
1530 /* Assemble the other variant part of the usage */
1531 if ((knownVMs[0].flag == VM_KNOWN) ||
1532 (knownVMs[0].flag == VM_IF_SERVER_CLASS)) {
1533 NULL_CHECK(vm1 = (*env)->NewStringUTF(env, knownVMs[0].name));
1534 NULL_CHECK(vm2 = (*env)->NewStringUTF(env, knownVMs[0].name+1));
1535 (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2);
1536 }
1537 for (i=1; i<knownVMsCount; i++) {
1538 if (knownVMs[i].flag == VM_KNOWN) {
1539 NULL_CHECK(vm1 = (*env)->NewStringUTF(env, knownVMs[i].name));
1540 NULL_CHECK(vm2 = (*env)->NewStringUTF(env, knownVMs[i].name+1));
1541 (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2);
1542 }
1543 }
1544 for (i=1; i<knownVMsCount; i++) {
1545 if (knownVMs[i].flag == VM_ALIASED_TO) {
1546 NULL_CHECK(vm1 = (*env)->NewStringUTF(env, knownVMs[i].name));
1547 NULL_CHECK(vm2 = (*env)->NewStringUTF(env, knownVMs[i].alias+1));
1548 (*env)->CallStaticVoidMethod(env, cls, vmSynonym, vm1, vm2);
1549 }
1550 }
1551
1552 /* The first known VM is the default */
1553 {
1554 jboolean isServerClassMachine = ServerClassMachine();
1555
1556 const char* defaultVM = knownVMs[0].name+1;
1557 if ((knownVMs[0].flag == VM_IF_SERVER_CLASS) && isServerClassMachine) {
1558 defaultVM = knownVMs[0].server_class+1;
1559 }
1560
1561 NULL_CHECK(vm1 = (*env)->NewStringUTF(env, defaultVM));
1562 (*env)->CallStaticVoidMethod(env, cls, vmErgo, isServerClassMachine, vm1);
1563 }
1564
1565 /* Complete the usage message and print to stderr*/
1566 (*env)->CallStaticVoidMethod(env, cls, printHelp, USE_STDERR);
1567 }
1568 return;
1569 }
1570
1571 /*
1572 * Read the jvm.cfg file and fill the knownJVMs[] array.
1573 *
1574 * The functionality of the jvm.cfg file is subject to change without
1575 * notice and the mechanism will be removed in the future.
1576 *
1577 * The lexical structure of the jvm.cfg file is as follows:
1578 *
1579 * jvmcfg := { vmLine }
1580 * vmLine := knownLine
1581 * | aliasLine
|