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