From 1af327c64a33941bc38a66f00c913548cef342d1 Mon Sep 17 00:00:00 2001 From: Avi Kivity <avi@cloudius-systems.com> Date: Thu, 24 Jan 2013 12:46:59 +0200 Subject: [PATCH] java: get main class, JVM parameters, and runtime arguments from command line Set with the imgedit tool. --- java.cc | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/java.cc b/java.cc index e62a65aa5..b90f0eff4 100644 --- a/java.cc +++ b/java.cc @@ -6,6 +6,13 @@ extern elf::program* prog; #define JVM_PATH "/usr/lib/jvm/jre/lib/amd64/server/libjvm.so" +JavaVMOption mkoption(const char* s) +{ + JavaVMOption opt; + opt.optionString = strdup(s); + return opt; +} + int main(int ac, char **av) { prog->add_object(JVM_PATH); @@ -15,9 +22,14 @@ int main(int ac, char **av) JavaVMInitArgs vm_args = {}; vm_args.version = JNI_VERSION_1_6; JNI_GetDefaultJavaVMInitArgs(&vm_args); - vm_args.nOptions = 1; - vm_args.options = new JavaVMOption[1]; - vm_args.options[0].optionString = strdup("-Djava.class.path=/tests"); + std::vector<JavaVMOption> options; + options.push_back(mkoption("-Djava.class.path=/tests")); + while (ac > 0 && av[0][0] == '-') { + options.push_back(mkoption(av[0])); + ++av, --ac; + } + vm_args.nOptions = options.size(); + vm_args.options = options.data(); auto JNI_CreateJavaVM = prog->lookup_function<jint (JavaVM**, JNIEnv**, void*)>("JNI_CreateJavaVM"); @@ -26,8 +38,15 @@ int main(int ac, char **av) auto ret = JNI_CreateJavaVM(&jvm, &env, &vm_args); assert(ret == 0); - auto mainclass = env->FindClass("Hello"); + auto mainclass = env->FindClass(av[0]); + ++av, --ac; + auto mainmethod = env->GetStaticMethodID(mainclass, "main", "([Ljava/lang/String;)V"); - env->CallStaticVoidMethod(mainclass, mainmethod, nullptr); + auto stringclass = env->FindClass("java/lang/String"); + auto args = env->NewObjectArray(ac, stringclass, nullptr); + for (auto i = 0; i < ac; ++av) { + env->SetObjectArrayElement(args, i, env->NewStringUTF(av[i])); + } + env->CallStaticVoidMethod(mainclass, mainmethod, args); } -- GitLab