- out_c.write("typedef struct " + struct_name + "_JCalls {\n")
- out_c.write("\tatomic_size_t refcnt;\n")
- out_c.write("\tJavaVM *vm;\n")
- out_c.write("\tjobject o;\n")
- for var_line in field_var_lines:
- if var_line.group(1) in trait_structs:
- out_c.write("\t" + var_line.group(1) + "_JCalls* " + var_line.group(2) + ";\n")
- for fn_line in trait_fn_lines:
- if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
- out_c.write("\tjmethodID " + fn_line.group(2) + "_meth;\n")
- out_c.write("} " + struct_name + "_JCalls;\n")
-
- out_java.write("\tpublic interface " + struct_name + " {\n")
- java_meths = []
- for fn_line in trait_fn_lines:
- java_meth_descr = "("
- if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
- ret_ty_info = java_c_types(fn_line.group(1), None)
-
- out_java.write("\t\t " + ret_ty_info.java_ty + " " + fn_line.group(2) + "(")
- is_const = fn_line.group(3) is not None
- out_c.write(fn_line.group(1) + fn_line.group(2) + "_jcall(")
- if is_const:
- out_c.write("const void* this_arg")
- else:
- out_c.write("void* this_arg")
-
- arg_names = []
- for idx, arg in enumerate(fn_line.group(4).split(',')):
- if arg == "":
- continue
- if idx >= 2:
- out_java.write(", ")
- out_c.write(", ")
- arg_conv_info = map_type(arg, True, None, False)
- out_c.write(arg.strip())
- out_java.write(arg_conv_info.java_ty + " " + arg_conv_info.arg_name)
- arg_names.append(arg_conv_info)
- java_meth_descr = java_meth_descr + arg_conv_info.java_fn_ty_arg
- java_meth_descr = java_meth_descr + ")" + ret_ty_info.java_fn_ty_arg
- java_meths.append(java_meth_descr)
-
- out_java.write(");\n")
- out_c.write(") {\n")
- out_c.write("\t" + struct_name + "_JCalls *j_calls = (" + struct_name + "_JCalls*) this_arg;\n")
- out_c.write("\tJNIEnv *env;\n")
- out_c.write("\tDO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);\n")
-
- for arg_info in arg_names:
- if arg_info.ret_conv is not None:
- out_c.write("\t" + arg_info.ret_conv[0].replace('\n', '\n\t').replace("_env", "env"));
- out_c.write(arg_info.arg_name)
- out_c.write(arg_info.ret_conv[1].replace('\n', '\n\t').replace("_env", "env") + "\n")
-
- if ret_ty_info.c_ty.endswith("Array"):
- assert(ret_ty_info.c_ty == "jbyteArray")
- out_c.write("\tjbyteArray jret = (*env)->CallObjectMethod(env, j_calls->o, j_calls->" + fn_line.group(2) + "_meth")
- elif not ret_ty_info.passed_as_ptr:
- out_c.write("\treturn (*env)->Call" + ret_ty_info.java_ty.title() + "Method(env, j_calls->o, j_calls->" + fn_line.group(2) + "_meth")
- else:
- out_c.write("\t" + fn_line.group(1).strip() + "* ret = (" + fn_line.group(1).strip() + "*)(*env)->CallLongMethod(env, j_calls->o, j_calls->" + fn_line.group(2) + "_meth");
+ with open(sys.argv[3] + "/structs/" + struct_name.replace("LDK","") + ".java", "w") as out_java_trait:
+ out_c.write("typedef struct " + struct_name + "_JCalls {\n")
+ out_c.write("\tatomic_size_t refcnt;\n")
+ out_c.write("\tJavaVM *vm;\n")
+ out_c.write("\tjweak o;\n")
+ for var_line in field_var_lines:
+ if var_line.group(1) in trait_structs:
+ out_c.write("\t" + var_line.group(1) + "_JCalls* " + var_line.group(2) + ";\n")
+ for fn_line in trait_fn_lines:
+ if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
+ out_c.write("\tjmethodID " + fn_line.group(2) + "_meth;\n")
+ out_c.write("} " + struct_name + "_JCalls;\n")
+
+ out_java_trait.write("package org.ldk.structs;\n\n")
+ out_java_trait.write("import org.ldk.impl.bindings;\n\n")
+ out_java_trait.write("import org.ldk.enums.*;\n\n")
+ out_java_trait.write("public class " + struct_name.replace("LDK","") + " extends CommonBase {\n")
+ out_java_trait.write("\t" + struct_name.replace("LDK", "") + "(Object _dummy, long ptr) { super(ptr); }\n")
+ out_java_trait.write("\tpublic " + struct_name.replace("LDK", "") + "(bindings." + struct_name + " arg")
+ for var_line in field_var_lines:
+ if var_line.group(1) in trait_structs:
+ out_java_trait.write(", bindings." + var_line.group(1) + " " + var_line.group(2))
+ out_java_trait.write(") {\n")
+ out_java_trait.write("\t\tsuper(bindings." + struct_name + "_new(arg")
+ for var_line in field_var_lines:
+ if var_line.group(1) in trait_structs:
+ out_java_trait.write(", " + var_line.group(2))
+ out_java_trait.write("));\n")
+ out_java_trait.write("\t\tthis.ptrs_to.add(arg);\n")
+ out_java_trait.write("\t}\n")
+ out_java_trait.write("\t@Override @SuppressWarnings(\"deprecation\")\n")
+ out_java_trait.write("\tprotected void finalize() throws Throwable {\n")
+ out_java_trait.write("\t\tbindings." + struct_name.replace("LDK","") + "_free(ptr); super.finalize();\n")
+ out_java_trait.write("\t}\n\n")
+
+ out_java.write("\tpublic interface " + struct_name + " {\n")
+ java_meths = []
+ for fn_line in trait_fn_lines:
+ java_meth_descr = "("
+ if fn_line.group(2) != "free" and fn_line.group(2) != "clone":
+ ret_ty_info = java_c_types(fn_line.group(1), None)
+
+ out_java.write("\t\t " + ret_ty_info.java_ty + " " + fn_line.group(2) + "(")
+ is_const = fn_line.group(3) is not None
+ out_c.write(fn_line.group(1) + fn_line.group(2) + "_jcall(")
+ if is_const:
+ out_c.write("const void* this_arg")
+ else:
+ out_c.write("void* this_arg")
+
+ arg_names = []
+ for idx, arg in enumerate(fn_line.group(4).split(',')):
+ if arg == "":
+ continue
+ if idx >= 2:
+ out_java.write(", ")
+ out_c.write(", ")
+ arg_conv_info = map_type(arg, True, None, False)
+ out_c.write(arg.strip())
+ out_java.write(arg_conv_info.java_ty + " " + arg_conv_info.arg_name)
+ arg_names.append(arg_conv_info)
+ java_meth_descr = java_meth_descr + arg_conv_info.java_fn_ty_arg
+ java_meth_descr = java_meth_descr + ")" + ret_ty_info.java_fn_ty_arg
+ java_meths.append(java_meth_descr)