diff --git a/SignatureDump.java b/SignatureDump.java new file mode 100644 index 00000000..aadce2fa --- /dev/null +++ b/SignatureDump.java @@ -0,0 +1,109 @@ +import java.lang.reflect.*; + +public final class SignatureDump { + public final static void main(String[] args) { + String class_name = args[0]; + try { + Class clazz = Class.forName(class_name); + Method[] methods = clazz.getDeclaredMethods(); + System.out.println("\tJavaMethodAndExtFunction functions[] = {"); + for (int i = 0; i < methods.length; i++) { + Method method = methods[i]; + int modifiers = method.getModifiers(); + if (!Modifier.isNative(modifiers)) + continue; + System.out.print("\t\t"); + System.out.print("{\""); + System.out.print(method.getName()); + System.out.print("\", \""); + System.out.print(getMethodSignature(method)); + System.out.print("\", (void*)&"); + System.out.print(getMethodMangled(class_name, method)); + System.out.print(", "); + String gl_name = getExtFunctionName(method); + if (gl_name != null) { + System.out.print("\""); + System.out.print(gl_name); + System.out.print("\""); + } else + System.out.print("NULL"); + System.out.print(", "); + if (gl_name != null) { + System.out.print("(void**)&"); + System.out.print(gl_name); + } else + System.out.print("NULL"); + System.out.print("}"); + if (i != methods.length - 1) + System.out.print(","); + System.out.println(); + } + System.out.print("\t};"); + System.out.println(); + System.out.println("\tint num_functions = NUMFUNCTIONS(functions);"); + System.out.print("\tjclass clazz = ext_ResetClass(env, \""); + String class_name_mangled = clazz.getName().replaceAll("\\.", "/"); + System.out.print(class_name_mangled); + System.out.println("\");"); + System.out.println("\tif (extgl_Extensions.)"); + System.out.println("\t\text_InitializeClass(env, clazz, ext_set, , num_functions, functions);"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private final static String getExtFunctionName(Method method) { + String name = method.getName(); + if (name.charAt(0) == 'n') + name = name.substring(1); + if (name.endsWith("VBO")) + return null; + return name; + } + + private final static String getMethodMangled(String class_name, Method method) { + class_name = class_name.replaceAll("\\.", "_"); + String mangled = "Java_" + class_name + "_" + method.getName(); + return mangled; + } + + private final static String getMethodSignature(Method method) { + Class[] arg_types = method.getParameterTypes(); + String signature = "("; + for (int i = 0; i < arg_types.length; i++) + signature += getTypeSignature(arg_types[i]); + Class return_type = method.getReturnType(); + signature += ")"; + signature += getTypeSignature(return_type); + return signature; + } + + private final static String getTypeSignature(Class type) { + if (type.equals(Boolean.class)) + return "Z"; + else if (type.equals(int.class)) + return "I"; + else if (type.equals(float.class)) + return "F"; + else if (type.equals(short.class)) + return "S"; + else if (type.equals(double.class)) + return "D"; + else if (type.equals(boolean.class)) + return "Z"; + else if (type.equals(byte.class)) + return "B"; + else if (type.equals(void.class)) + return "V"; + else if (type.equals(char.class)) + throw new RuntimeException(); + else if (type.equals(long.class)) + throw new RuntimeException(); + else if (type.isArray()) + throw new RuntimeException(); + else { + String type_name = type.getName().replaceAll("\\.", "/"); + return "L" + type_name + ";"; + } + } +} diff --git a/src/native/linux/org_lwjgl_input_Cursor.cpp b/src/native/linux/org_lwjgl_input_Cursor.cpp index 2d127f42..115bb4b7 100644 --- a/src/native/linux/org_lwjgl_input_Cursor.cpp +++ b/src/native/linux/org_lwjgl_input_Cursor.cpp @@ -75,7 +75,7 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_input_Cursor_nCreateCursor } Cursor cursor = XcursorImagesLoadCursor(disp, cursor_images); XcursorImagesDestroy(cursor_images); - return cursor; + return (jlong)cursor; } /*