2008-02-19 18:06:52 +00:00
|
|
|
/* Copyright (c) 2008, Avian Contributors
|
|
|
|
|
|
|
|
Permission to use, copy, modify, and/or distribute this software
|
|
|
|
for any purpose with or without fee is hereby granted, provided
|
|
|
|
that the above copyright notice and this permission notice appear
|
|
|
|
in all copies.
|
|
|
|
|
|
|
|
There is NO WARRANTY for this software. See license.txt for
|
|
|
|
details. */
|
|
|
|
|
2007-10-25 15:04:13 +00:00
|
|
|
#include "stdlib.h"
|
2007-10-25 22:06:05 +00:00
|
|
|
#include "stdio.h"
|
2007-10-25 15:04:13 +00:00
|
|
|
#include "string.h"
|
2008-01-19 00:54:36 +00:00
|
|
|
#include "stdint.h"
|
2007-10-25 15:04:13 +00:00
|
|
|
#include "jni.h"
|
2007-06-20 19:20:25 +00:00
|
|
|
|
2008-01-19 00:54:36 +00:00
|
|
|
#ifdef __MINGW32__
|
|
|
|
# define PATH_SEPARATOR ';'
|
|
|
|
#else
|
|
|
|
# define PATH_SEPARATOR ':'
|
|
|
|
#endif
|
|
|
|
|
2007-10-25 15:04:13 +00:00
|
|
|
namespace {
|
2007-06-20 19:20:25 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
usageAndExit(const char* name)
|
|
|
|
{
|
2008-07-14 17:21:59 +00:00
|
|
|
fprintf
|
|
|
|
(stderr, "usage: %s\n"
|
|
|
|
"\t[{-cp|-classpath} <classpath>]\n"
|
|
|
|
"\t[-Xmx<maximum heap size>]\n"
|
|
|
|
"\t[-Xbootclasspath/p:<classpath to prepend to bootstrap classpath>]\n"
|
2008-07-14 17:51:20 +00:00
|
|
|
"\t[-Xbootclasspath:<bootstrap classpath>]\n"
|
|
|
|
"\t[-Xbootclasspath/a:<classpath to append to bootstrap classpath>]\n"
|
2008-07-14 17:23:33 +00:00
|
|
|
"\t[-D<property name>=<property value> ...]\n"
|
2008-07-14 17:21:59 +00:00
|
|
|
"\t<class name> [<argument> ...]\n", name);
|
2007-06-20 19:20:25 +00:00
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
int
|
|
|
|
main(int ac, const char** av)
|
|
|
|
{
|
2008-07-14 17:02:43 +00:00
|
|
|
JavaVMInitArgs vmArgs;
|
|
|
|
vmArgs.version = JNI_VERSION_1_2;
|
|
|
|
vmArgs.nOptions = 1;
|
|
|
|
vmArgs.ignoreUnrecognized = JNI_TRUE;
|
2007-10-25 15:04:13 +00:00
|
|
|
|
2007-06-20 19:20:25 +00:00
|
|
|
const char* class_ = 0;
|
|
|
|
int argc = 0;
|
|
|
|
const char** argv = 0;
|
2008-07-14 17:02:43 +00:00
|
|
|
const char* classpath = ".";
|
2007-06-20 19:20:25 +00:00
|
|
|
|
|
|
|
for (int i = 1; i < ac; ++i) {
|
2008-07-14 17:02:43 +00:00
|
|
|
if (strcmp(av[i], "-cp") == 0
|
|
|
|
or strcmp(av[i], "-classpath") == 0)
|
|
|
|
{
|
|
|
|
classpath = av[++i];
|
|
|
|
} else if (strncmp(av[i], "-X", 2) == 0
|
|
|
|
or strncmp(av[i], "-D", 2) == 0)
|
|
|
|
{
|
|
|
|
++ vmArgs.nOptions;
|
2007-06-20 19:20:25 +00:00
|
|
|
} else {
|
|
|
|
class_ = av[i++];
|
|
|
|
if (i < ac) {
|
|
|
|
argc = ac - i;
|
|
|
|
argv = av + i;
|
|
|
|
i = ac;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-07-14 17:02:43 +00:00
|
|
|
#ifdef BOOT_LIBRARY
|
|
|
|
++ vmArgs.nOptions;
|
|
|
|
#endif
|
|
|
|
|
2008-07-14 17:51:20 +00:00
|
|
|
#ifdef BOOT_CLASSPATH
|
|
|
|
++ vmArgs.nOptions;
|
|
|
|
#endif
|
|
|
|
|
2008-11-29 23:08:14 +00:00
|
|
|
#ifdef BOOT_IMAGE
|
|
|
|
++ vmArgs.nOptions;
|
|
|
|
#endif
|
|
|
|
|
2009-06-06 20:18:33 +00:00
|
|
|
#ifdef BOOT_BUILTINS
|
|
|
|
++ vmArgs.nOptions;
|
|
|
|
#endif
|
|
|
|
|
2008-07-14 17:02:43 +00:00
|
|
|
JavaVMOption options[vmArgs.nOptions];
|
|
|
|
vmArgs.options = options;
|
|
|
|
|
2008-07-14 17:51:20 +00:00
|
|
|
unsigned optionIndex = 0;
|
2008-07-14 17:02:43 +00:00
|
|
|
|
2008-11-29 23:08:14 +00:00
|
|
|
#ifdef BOOT_IMAGE
|
|
|
|
options[optionIndex++].optionString
|
|
|
|
= const_cast<char*>("-Davian.bootimage=" BOOT_IMAGE);
|
|
|
|
#endif
|
|
|
|
|
2008-07-14 17:51:20 +00:00
|
|
|
#ifdef BOOT_CLASSPATH
|
|
|
|
options[optionIndex++].optionString
|
|
|
|
= const_cast<char*>("-Xbootclasspath:" BOOT_CLASSPATH);
|
2008-01-19 00:54:36 +00:00
|
|
|
#endif
|
|
|
|
|
2008-03-31 03:43:43 +00:00
|
|
|
#ifdef BOOT_LIBRARY
|
2008-07-14 17:02:43 +00:00
|
|
|
options[optionIndex++].optionString
|
|
|
|
= const_cast<char*>("-Davian.bootstrap=" BOOT_LIBRARY);
|
2008-03-31 03:43:43 +00:00
|
|
|
#endif
|
|
|
|
|
2009-06-06 20:18:33 +00:00
|
|
|
#ifdef BOOT_BUILTINS
|
|
|
|
options[optionIndex++].optionString
|
|
|
|
= const_cast<char*>("-Davian.builtins=" BOOT_BUILTINS);
|
|
|
|
#endif
|
|
|
|
|
2008-07-14 17:02:43 +00:00
|
|
|
#define CLASSPATH_PROPERTY "-Djava.class.path="
|
|
|
|
|
|
|
|
unsigned classpathSize = strlen(classpath);
|
|
|
|
unsigned classpathPropertyBufferSize
|
|
|
|
= sizeof(CLASSPATH_PROPERTY) + classpathSize;
|
|
|
|
|
|
|
|
char classpathPropertyBuffer[classpathPropertyBufferSize];
|
|
|
|
memcpy(classpathPropertyBuffer,
|
|
|
|
CLASSPATH_PROPERTY,
|
|
|
|
sizeof(CLASSPATH_PROPERTY) - 1);
|
|
|
|
memcpy(classpathPropertyBuffer + sizeof(CLASSPATH_PROPERTY) - 1,
|
|
|
|
classpath,
|
|
|
|
classpathSize + 1);
|
|
|
|
|
|
|
|
options[optionIndex++].optionString = classpathPropertyBuffer;
|
|
|
|
|
2007-10-25 18:33:43 +00:00
|
|
|
for (int i = 1; i < ac; ++i) {
|
2008-07-14 17:02:43 +00:00
|
|
|
if (strncmp(av[i], "-X", 2) == 0
|
|
|
|
or strncmp(av[i], "-D", 2) == 0)
|
|
|
|
{
|
|
|
|
options[optionIndex++].optionString = const_cast<char*>(av[i]);
|
2007-10-25 18:33:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-20 19:20:25 +00:00
|
|
|
if (class_ == 0) {
|
|
|
|
usageAndExit(av[0]);
|
|
|
|
}
|
|
|
|
|
2007-10-25 15:04:13 +00:00
|
|
|
JavaVM* vm;
|
2007-10-25 22:34:40 +00:00
|
|
|
void* env;
|
|
|
|
JNI_CreateJavaVM(&vm, &env, &vmArgs);
|
|
|
|
JNIEnv* e = static_cast<JNIEnv*>(env);
|
2007-10-25 15:04:13 +00:00
|
|
|
|
|
|
|
jclass c = e->FindClass(class_);
|
|
|
|
if (not e->ExceptionOccurred()) {
|
|
|
|
jmethodID m = e->GetStaticMethodID(c, "main", "([Ljava/lang/String;)V");
|
|
|
|
if (not e->ExceptionOccurred()) {
|
|
|
|
jclass stringClass = e->FindClass("java/lang/String");
|
|
|
|
if (not e->ExceptionOccurred()) {
|
|
|
|
jobjectArray a = e->NewObjectArray(argc, stringClass, 0);
|
|
|
|
if (not e->ExceptionOccurred()) {
|
|
|
|
for (int i = 0; i < argc; ++i) {
|
|
|
|
e->SetObjectArrayElement(a, i, e->NewStringUTF(argv[i]));
|
|
|
|
}
|
|
|
|
|
|
|
|
e->CallStaticVoidMethod(c, m, a);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int exitCode = 0;
|
|
|
|
if (e->ExceptionOccurred()) {
|
|
|
|
exitCode = -1;
|
|
|
|
e->ExceptionDescribe();
|
|
|
|
}
|
|
|
|
|
|
|
|
vm->DestroyJavaVM();
|
|
|
|
|
|
|
|
return exitCode;
|
2007-06-20 19:20:25 +00:00
|
|
|
}
|