-`{
- inline jvalue * convert_array_of_Object_to_c(nullable_Array_of_nullable_Object nullable_nit_array, JNIEnv* env){
- if(nullable_Array_of_nullable_Object_is_null(nullable_nit_array)){
- return NULL;
- }
- Array_of_nullable_Object nit_array = nullable_Array_of_nullable_Object_as_Array_of_nullable_Object(nullable_nit_array);
- int nit_array_length = Array_of_nullable_Object_length(nit_array);
- int i;
- jvalue *c_array = malloc(sizeof(jvalue)*(nit_array_length));
- for (i = 0; i < nit_array_length; i ++) {
- nullable_Object nullable_obj = Array_of_nullable_Object__index(nit_array, i);
- if(nullable_Object_is_a_Int(nullable_obj)) {
- int val = nullable_Object_as_Int(nullable_obj);
- c_array[i].i = val;
- }else if (nullable_Object_is_a_Char(nullable_obj)){
- char val = nullable_Object_as_Char(nullable_obj);
- c_array[i].c = val;
- }else if (nullable_Object_is_a_Bool(nullable_obj)){
- int val = nullable_Object_as_Bool(nullable_obj);
- c_array[i].z = val;
- }else if(nullable_Object_is_a_Float(nullable_obj)){
- float val = nullable_Object_as_Float(nullable_obj);
- c_array[i].f = val;
- }else if(nullable_Object_is_a_JObject(nullable_obj)){
- jobject val = nullable_Object_as_JObject(nullable_obj);
- c_array[i].l = val;
- }else if(nullable_Object_is_a_String(nullable_obj)){
- String val = nullable_Object_as_String(nullable_obj);
- char* c = String_to_cstring(val);
- jstring js = (*env)->NewStringUTF(env, c);
- c_array[i].l = js;
- }else {
- fprintf(stderr, "NOT YET SUPPORTED: nit objects are not supported\n");
- exit(1);
- }
- }
- return c_array;
- }
-`}
+# Utility to select options to create the VM using `create_jvm`
+#
+# Usage example:
+#
+# ~~~~nitish
+# var builder = new JavaVMBuilder
+# builder.options.add "-Djava.class.path=."
+# var jvm = builder.create_jvm
+# var env = builder.jni_env
+# ~~~~
+class JavaVMBuilder
+ super JniEnvRef
+
+ # Version code of the JVM requested by `create_jvm`
+ #
+ # Default at 0x00010002
+ var version = 0x00010002 is writable
+
+ # Additional option strings
+ var options = new Array[String]
+
+ # Create the JVM and return it on success
+ fun create_jvm: nullable JavaVM
+ do
+ var args = new JavaVMInitArgs
+ args.version = version
+ args.set_default
+ args.n_options = options.length
+
+ var c_options = new JavaVMOptionArray(options.length)
+ for o in options.length.times do
+ var option = options[o]
+ var c_option = c_options[o]
+ c_option.string = option
+ end
+
+ args.options = c_options
+
+ var jvm = new JavaVM(args, self)
+
+ args.free
+ c_options.free
+
+ if jvm.address_is_null then return null
+ return jvm
+ end
+end
+
+private extern class JavaVMInitArgs `{ JavaVMInitArgs* `}
+ new `{ return (JavaVMInitArgs*)malloc(sizeof(JavaVMInitArgs)); `}
+
+ # Set the defaut config for a VM
+ # Can be called after setting the version
+ #
+ # Unavailable on Android, where you cannot instanciate a new JVM.
+ fun set_default `{
+ #ifndef ANDROID
+ JNI_GetDefaultJavaVMInitArgs(recv);
+ #endif
+ `}
+
+ fun version: Int `{ return recv->version; `}
+ fun version=(v: Int) `{ recv->version = v; `}
+
+ fun options: JavaVMOptionArray `{ return recv->options; `}
+ fun options=(v: JavaVMOptionArray) `{ recv->options = v; `}
+
+ fun n_options: Int `{ return recv->nOptions; `}
+ fun n_options=(v: Int) `{ recv->nOptions = v; `}
+end
+
+private extern class JavaVMOption `{ JavaVMOption* `}
+ fun string: String import NativeString.to_s `{
+ return NativeString_to_s((char*)recv->optionString);
+ `}
+ fun string=(v: String) import String.to_cstring `{
+ recv->optionString = String_to_cstring(v);
+ `}
+
+ fun extra_info: String import NativeString.to_s `{
+ return NativeString_to_s((char*)recv->extraInfo);
+ `}
+ fun extra_info=(v: String) import String.to_cstring `{
+ recv->extraInfo = String_to_cstring(v);
+ `}
+end
+
+private extern class JavaVMOptionArray `{ JavaVMOption* `}
+ new(size: Int) `{ return (JavaVMOption*)malloc(sizeof(JavaVMOption)*size); `}
+
+ fun [](i: Int): JavaVMOption `{ return recv+i; `}
+end