*** empty log message ***
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java
index 2a2179e..a873a5a 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java
@@ -13,10 +13,13 @@
 import java.lang.reflect.*;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class NativesGenerator extends JNIGenerator {
 
 boolean enterExitMacro;
+String currentSource;
 
 public NativesGenerator() {
 	enterExitMacro = true;
@@ -60,6 +63,7 @@
 		if ((method.getModifiers() & Modifier.NATIVE) != 0) break;
 	}
 	if (i == methods.length) return;
+	currentSource = loadSource(clazz);
 	sort(methods);
 	generateNativeMacro(clazz);
 	generateExcludes(methods);
@@ -76,28 +80,138 @@
 	}
 }
 
+boolean canChangeFor64(Class clazz) {
+	if (clazz == int.class) return true;
+	if (clazz == int[].class) return true;
+	if (clazz == float.class) return true;
+	if (clazz == float[].class) return true;
+	return false;
+}
+
+String asRegex(String str) {
+	int dot = str.lastIndexOf('.');
+	if (dot != -1) str = str.substring(dot + 1);
+	StringBuffer buffer = new StringBuffer();
+	for (int i = 0; i < str.length(); i++) {
+		char c = str.charAt(i);
+		switch (c) {
+			case '[':
+				buffer.append(".*\\[");
+				break;
+			case ']':
+				buffer.append("\\s*\\]");
+				break;
+			default: buffer.append(c);
+		}
+	}
+	return buffer.toString();
+}
+
+boolean get64MethodTypes(Method method, Class[] paramTypes64, Class[] returnType64) {
+	boolean canChange = false;
+	Class returnType = method.getReturnType();
+	if (!(canChange |= canChangeFor64(returnType))) returnType64[0] = returnType;
+	Class[] paramTypes = method.getParameterTypes();
+	for (int i = 0; i < paramTypes.length; i++) {
+		if (!(canChange |= canChangeFor64(paramTypes[i]))) paramTypes64[i] = paramTypes[i];
+	}
+	if (!canChange) return false;
+	boolean result = false;
+	Matcher matcher = Pattern.compile("public\\s*static\\s*final\\s*native\\s*").matcher(currentSource);
+	int start = 0;
+	String name = method.getName();
+	while (matcher.find(start)) {
+		start = matcher.end();
+		int semicolon = currentSource.indexOf(';', matcher.end());
+		String mthDecl = currentSource.substring(matcher.end(), semicolon);
+		int startParen = mthDecl.indexOf('(');
+		String returnAndMethod = mthDecl.substring(0, startParen);
+		if (returnAndMethod.indexOf(name) == -1) continue;
+		int endParen = mthDecl.indexOf(')', startParen + 1);
+		String params = mthDecl.substring(startParen + 1, endParen).trim();
+		String[] paramsDecl = params.length() == 0 ? new String[0] : params.split(",");
+		if (paramsDecl.length != paramTypes.length) continue;
+		boolean found = true;
+		for (int i = 0; i < paramsDecl.length; i++) {
+			String paramDecl = paramsDecl[i].trim();
+			int index = 0;
+			//TODO not working for arrays
+			while (!Character.isWhitespace(paramDecl.charAt(index))) index++;
+			String paramTypeRegex = asRegex(getTypeSignature3(paramTypes[i]));
+			if (!paramDecl.substring(0, index).matches(paramTypeRegex)) {
+				found = false;
+				break;
+			}
+		}
+		if (found) {
+			for (int i = 0; i < paramsDecl.length; i++) {
+				if (paramTypes64[i] == null) {
+					if (paramsDecl[i].indexOf("/*") != -1) {
+						if (paramTypes[i] == int.class) paramTypes64[i] = long.class;
+						else if (paramTypes[i] == int[].class) paramTypes64[i] = long[].class;
+						else if (paramTypes[i] == float.class) paramTypes64[i] = double.class;
+						else if (paramTypes[i] == float[].class) paramTypes64[i] = double[].class;
+						result = true;
+					} else {
+						paramTypes64[i] = paramTypes[i];
+					}
+				}
+			}
+			if (returnAndMethod.indexOf("/*") != -1) {
+				if (returnType == int.class) returnType64[0] = long.class;
+				else if (returnType == int[].class) returnType64[0] = long[].class;
+				else if (returnType == float.class) returnType64[0] = double.class;
+				else if (returnType == float[].class) returnType64[0] = double[].class;
+			} else {
+				returnType64[0] = returnType;
+			}
+			System.out.println(method + " " + mthDecl);
+			break;
+		}
+	}		
+	return result;
+
+}
+
 public void generate(Method method) {
 	MethodData methodData = getMetaData().getMetaData(method);
 	if (methodData.getFlag(FLAG_NO_GEN)) return;
 	Class returnType = method.getReturnType();
-	Class[] paramTypes = method.getParameterTypes();
-	String function = getFunctionName(method);
-	
 	if (!(returnType == Void.TYPE || returnType.isPrimitive() || isSystemClass(returnType) || returnType == String.class)) {
 		output("Warning: bad return type. :");
 		outputln(method.toString());
 		return;
 	}
-	
-	generateSourceStart(function);
+	Class[] paramTypes = method.getParameterTypes();
+	Class[] paramTypes64 = new Class[paramTypes.length];
+	Class[] returnType64 = new Class[1];
+	get64MethodTypes(method, paramTypes64, returnType64);
+	String function = getFunctionName(method), function64 = getFunctionName(method, paramTypes64);
+	generateSourceStart(function, function64);
+	boolean sameFunction = function.equals(function64);
+	if (!sameFunction) {
+		outputln("#ifndef SWT_PTR_SIZE_64");
+	}
 	if (isCPP) {
 		output("extern \"C\" ");
-		generateFunctionPrototype(method, function, paramTypes, returnType, true);
+		generateFunctionPrototype(method, function, paramTypes, returnType, paramTypes64, returnType64[0], true);
 		outputln(";");
 	}
-	generateFunctionPrototype(method, function, paramTypes, returnType, false);
-	generateFunctionBody(method, methodData, function, paramTypes, returnType);
-	generateSourceEnd(function);
+	generateFunctionPrototype(method, function, paramTypes, returnType, paramTypes64, returnType64[0], !sameFunction);
+	if (!function.equals(function64)) {
+		outputln();
+		outputln("#else");
+		if (isCPP) {
+			output("extern \"C\" ");
+			generateFunctionPrototype(method, function64, paramTypes, returnType, paramTypes64, returnType64[0], true);
+			outputln(";");
+		}
+		generateFunctionPrototype(method, function64, paramTypes, returnType, paramTypes64, returnType64[0], !sameFunction);
+		outputln();
+		outputln("#endif");
+	}
+	generateFunctionBody(method, methodData, function, paramTypes, returnType, function64, paramTypes64, returnType64[0]);
+	generateSourceEnd(function, function64);
 	outputln();
 }
 
@@ -143,7 +257,7 @@
 	outputln();
 }
 
-boolean generateGetParameter(Method method, int i, Class paramType, ParameterData paramData, boolean critical, int indent) {
+boolean generateGetParameter(Method method, int i, Class paramType, Class paramType64, ParameterData paramData, boolean critical, int indent) {
 	if (paramType.isPrimitive() || isSystemClass(paramType)) return false;
 	String iStr = String.valueOf(i);
 	for (int j = 0; j < indent; j++) output("\t");
@@ -158,7 +272,7 @@
 			if (critical) {
 				if (isCPP) {
 					output("(");
-					output(getTypeSignature2(componentType));
+					output(getTypeSignature2(componentType, componentType != paramType64.getComponentType()));
 					output("*)");
 					output("env->GetPrimitiveArrayCritical(arg");
 				} else {
@@ -172,7 +286,7 @@
 				} else {
 					output("(*env)->Get");
 				}
-				output(getTypeSignature1(componentType));
+				output(getTypeSignature1(componentType, componentType != paramType64.getComponentType()));
 				if (isCPP) {
 					output("ArrayElements(arg");
 				} else {
@@ -220,7 +334,7 @@
 	return true;
 }
 
-void generateSetParameter(int i, Class paramType, ParameterData paramData, boolean critical) {
+void generateSetParameter(int i, Class paramType, Class paramType64, ParameterData paramData, boolean critical) {
 	if (paramType.isPrimitive() || isSystemClass(paramType)) return;
 	String iStr = String.valueOf(i);
 	if (paramType.isArray()) {
@@ -244,7 +358,7 @@
 				} else {
 					output("(*env)->Release");
 				}
-				output(getTypeSignature1(componentType));
+				output(getTypeSignature1(componentType, componentType != paramType64.getComponentType()));
 				if (isCPP) {
 					output("ArrayElements(arg");
 				} else {
@@ -306,25 +420,49 @@
 	}
 }
 
-void generateExitMacro(Method method, String function) {
+void generateExitMacro(Method method, String function, String function64) {
 	if (!enterExitMacro) return;
+	if (!function.equals(function64)) {
+		outputln("#ifndef SWT_PTR_SIZE_64");
+	}
 	output("\t");
 	output(getClassName(method.getDeclaringClass()));
 	output("_NATIVE_EXIT(env, that, ");
 	output(function);
 	outputln("_FUNC);");
+	if (!function.equals(function64)) {
+		outputln("#else");
+		output("\t");
+		output(getClassName(method.getDeclaringClass()));
+		output("_NATIVE_EXIT(env, that, ");
+		output(function64);
+		outputln("_FUNC);");
+		outputln("#endif");
+	}
 }
 
-void generateEnterMacro(Method method, String function) {
+void generateEnterMacro(Method method, String function, String function64) {
 	if (!enterExitMacro) return;
+	if (!function.equals(function64)) {
+		outputln("#ifndef SWT_PTR_SIZE_64");
+	}
 	output("\t");
 	output(getClassName(method.getDeclaringClass()));
 	output("_NATIVE_ENTER(env, that, ");
 	output(function);
 	outputln("_FUNC);");
+	if (!function.equals(function64)) {
+		outputln("#else");
+		output("\t");
+		output(getClassName(method.getDeclaringClass()));
+		output("_NATIVE_ENTER(env, that, ");
+		output(function64);
+		outputln("_FUNC);");
+		outputln("#endif");
+	}
 }
 
-boolean generateLocalVars(Method method, Class[] paramTypes, Class returnType) {
+boolean generateLocalVars(Method method, Class[] paramTypes, Class returnType, Class[] paramTypes64, Class returnType64) {
 	boolean needsReturn = enterExitMacro;
 	for (int i = 0; i < paramTypes.length; i++) {
 		Class paramType = paramTypes[i];
@@ -334,7 +472,7 @@
 		if (paramType.isArray()) {
 			Class componentType = paramType.getComponentType();
 			if (componentType.isPrimitive()) {
-				output(getTypeSignature2(componentType));
+				output(getTypeSignature2(componentType, componentType != paramTypes64[i].getComponentType()));
 				output(" *lparg" + i);
 				output("=NULL;");
 			} else {
@@ -364,21 +502,21 @@
 	if (needsReturn) {
 		if (returnType != Void.TYPE) {
 			output("\t");
-			output(getTypeSignature2(returnType));
+			output(getTypeSignature2(returnType, returnType != returnType64));
 			outputln(" rc = 0;");
 		}
 	}
 	return needsReturn;
 }
 
-boolean generateGetters(Method method, Class[] paramTypes) {
+boolean generateGetters(Method method, Class[] paramTypes, Class[] paramTypes64) {
 	boolean genFailTag = false;
 	int criticalCount = 0;
 	for (int i = 0; i < paramTypes.length; i++) {
 		Class paramType = paramTypes[i];
 		ParameterData paramData = getMetaData().getMetaData(method, i);
 		if (!isCritical(paramType, paramData)) {
-			genFailTag |= generateGetParameter(method, i, paramType, paramData, false, 1);
+			genFailTag |= generateGetParameter(method, i, paramType, paramTypes64[i], paramData, false, 1);
 		} else {
 			criticalCount++;
 		}
@@ -390,7 +528,7 @@
 			Class paramType = paramTypes[i];
 			ParameterData paramData = getMetaData().getMetaData(method, i);
 			if (isCritical(paramType, paramData)) {
-				genFailTag |= generateGetParameter(method, i, paramType, paramData, true, 2);
+				genFailTag |= generateGetParameter(method, i, paramType, paramTypes64[i], paramData, true, 2);
 			}
 		}
 		outputln("\t} else");
@@ -400,7 +538,7 @@
 			Class paramType = paramTypes[i];
 			ParameterData paramData = getMetaData().getMetaData(method, i);
 			if (isCritical(paramType, paramData)) {
-				genFailTag |= generateGetParameter(method, i, paramType, paramData, false, 2);
+				genFailTag |= generateGetParameter(method, i, paramType, paramTypes64[i], paramData, false, 2);
 			}
 		}
 		outputln("\t}");
@@ -408,7 +546,7 @@
 	return genFailTag;
 }
 
-void generateSetters(Method method, Class[] paramTypes) {
+void generateSetters(Method method, Class[] paramTypes, Class[] paramTypes64) {
 	int criticalCount = 0;
 	for (int i = paramTypes.length - 1; i >= 0; i--) {
 		Class paramType = paramTypes[i];
@@ -425,7 +563,7 @@
 			ParameterData paramData = getMetaData().getMetaData(method, i);
 			if (isCritical(paramType, paramData)) {
 				output("\t");
-				generateSetParameter(i, paramType, paramData, true);
+				generateSetParameter(i, paramType, paramTypes64[i], paramData, true);
 			}
 		}
 		outputln("\t} else");
@@ -436,7 +574,7 @@
 			ParameterData paramData = getMetaData().getMetaData(method, i);
 			if (isCritical(paramType, paramData)) {
 				output("\t");
-				generateSetParameter(i, paramType, paramData, false);
+				generateSetParameter(i, paramType, paramTypes64[i], paramData, false);
 			}
 		}
 		outputln("\t}");
@@ -445,14 +583,14 @@
 		Class paramType = paramTypes[i];
 		ParameterData paramData = getMetaData().getMetaData(method, i);
 		if (!isCritical(paramType, paramData)) {
-			generateSetParameter(i, paramType, paramData, false);
+			generateSetParameter(i, paramType, paramTypes64[i], paramData, false);
 		}
 	}
 }
 
-void generateDynamicFunctionCall(Method method, MethodData methodData, Class[] paramTypes, Class returnType, boolean needsReturn) {
+void generateDynamicFunctionCall(Method method, MethodData methodData, Class[] paramTypes, Class returnType, Class[] paramTypes64, Class returnType64, boolean needsReturn) {
 	outputln("/*");
-	generateFunctionCall(method, methodData, paramTypes, returnType, needsReturn);
+	generateFunctionCall(method, methodData, paramTypes, returnType, paramTypes64, returnType64, needsReturn);
 	outputln("*/");
 	outputln("\t{");
 
@@ -478,9 +616,9 @@
 		outputln("\t\t}");
 		outputln("\t\tif (fp) {");
 		output("\t\t");
-		generateFunctionCallLeftSide(method, methodData, returnType, needsReturn);
+		generateFunctionCallLeftSide(method, methodData, returnType, returnType64, needsReturn);
 		output("fp");
-		generateFunctionCallRightSide(method, methodData, paramTypes, 0);
+		generateFunctionCallRightSide(method, methodData, paramTypes, paramTypes64, 0);
 		output(";");
 		outputln();
 		outputln("\t\t}");
@@ -488,7 +626,7 @@
 		outputln("\t\tstatic int initialized = 0;");
 		outputln("\t\tstatic CFBundleRef bundle = NULL;");
 		output("\t\ttypedef ");
-		output(getTypeSignature2(returnType));
+		output(getTypeSignature2(returnType, returnType != returnType64));
 		output(" (*FPTR)(");
 		for (int i = 0; i < paramTypes.length; i++) {
 			if (i != 0) output(", ");
@@ -498,7 +636,7 @@
 			if (cast.length() > 2) {
 				output(cast.substring(1, cast.length() - 1));
 			} else {
-				output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT)));
+				output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT), paramType != paramTypes64[i]));
 			}
 		}
 		outputln(");");
@@ -519,9 +657,9 @@
 		outputln("\t\t}");
 		outputln("\t\tif (fptr) {");
 		output("\t\t");
-		generateFunctionCallLeftSide(method, methodData, returnType, needsReturn);
+		generateFunctionCallLeftSide(method, methodData, returnType, returnType64, needsReturn);
 		output("(*fptr)");
-		generateFunctionCallRightSide(method, methodData, paramTypes, 0);
+		generateFunctionCallRightSide(method, methodData, paramTypes, paramTypes64, 0);
 		output(";");
 		outputln();
 		outputln("\t\t}");
@@ -529,7 +667,7 @@
 		outputln("\t\tstatic int initialized = 0;");
 		outputln("\t\tstatic void *handle = NULL;");
 		output("\t\ttypedef ");
-		output(getTypeSignature2(returnType));
+		output(getTypeSignature2(returnType, returnType != returnType64));
 		output(" (*FPTR)(");
 		for (int i = 0; i < paramTypes.length; i++) {
 			if (i != 0) output(", ");
@@ -539,7 +677,7 @@
 			if (cast.length() > 2) {
 				output(cast.substring(1, cast.length() - 1));
 			} else {
-				output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT)));
+				output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT), paramType != paramTypes64[i]));
 			}
 		}
 		outputln(");");
@@ -560,9 +698,9 @@
 		outputln("\t\t}");
 		outputln("\t\tif (fptr) {");
 		output("\t\t");
-		generateFunctionCallLeftSide(method, methodData, returnType, needsReturn);
+		generateFunctionCallLeftSide(method, methodData, returnType, returnType64, needsReturn);
 		output("(*fptr)");
-		generateFunctionCallRightSide(method, methodData, paramTypes, 0);
+		generateFunctionCallRightSide(method, methodData, paramTypes, paramTypes64, 0);
 		output(";");
 		outputln();
 		outputln("\t\t}");
@@ -571,7 +709,7 @@
 	outputln("\t}");
 }
 
-void generateFunctionCallLeftSide(Method method, MethodData methodData, Class returnType, boolean needsReturn) {
+void generateFunctionCallLeftSide(Method method, MethodData methodData, Class returnType, Class returnType64, boolean needsReturn) {
 	output("\t");
 	if (returnType != Void.TYPE) {
 		if (needsReturn) {
@@ -580,7 +718,7 @@
 			output("return ");
 		}
 		output("(");
-		output(getTypeSignature2(returnType));
+		output(getTypeSignature2(returnType, returnType != returnType64));
 		output(")");
 	}
 	if (methodData.getFlag(FLAG_ADDRESS)) {
@@ -591,7 +729,7 @@
 	}
 }
 
-void generateFunctionCallRightSide(Method method, MethodData methodData, Class[] paramTypes, int paramStart) {
+void generateFunctionCallRightSide(Method method, MethodData methodData, Class[] paramTypes, Class[] paramTypes64, int paramStart) {
 	if (!methodData.getFlag(FLAG_CONST)) {
 		output("(");
 		if (methodData.getFlag(FLAG_JNI)) {
@@ -616,7 +754,7 @@
 	}
 }
 
-void generateFunctionCall(Method method, MethodData methodData, Class[] paramTypes, Class returnType, boolean needsReturn) {
+void generateFunctionCall(Method method, MethodData methodData, Class[] paramTypes, Class returnType, Class[] paramTypes64, Class returnType64, boolean needsReturn) {
 	String name = method.getName();
 	boolean objc_struct = false;
 	if (name.equals("objc_msgSend_stret")) {
@@ -631,7 +769,7 @@
 		output(copy);
 		output(" temp = ");
 	} else {
-		generateFunctionCallLeftSide(method, methodData, returnType, needsReturn);
+		generateFunctionCallLeftSide(method, methodData, returnType, returnType64, needsReturn);
 	}
 	int paramStart = 0;
 	if (name.startsWith("_")) name = name.substring(1);
@@ -643,22 +781,22 @@
 			output(cast);
 		} else {
 			output("(");
-			output(getTypeSignature2(returnType));
+			output(getTypeSignature2(returnType, returnType != returnType64));
 			output(" (*)())");
 		}
 		output("arg0)");
 		paramStart = 1;
 	} else if (name.startsWith("VtblCall")) {
 		output("((");
-		output(getTypeSignature2(returnType));
+		output(getTypeSignature2(returnType, returnType != returnType64));
 		output(" (STDMETHODCALLTYPE *)(");
 		for (int i = 1; i < paramTypes.length; i++) {
 			if (i != 1) output(", ");
 			Class paramType = paramTypes[i];
-			output(getTypeSignature4(paramType));
+			output(getTypeSignature4(paramType, false, paramType != paramTypes64[i]));
 		}
 		output("))(*(");
-		output(getTypeSignature4(paramTypes[1]));
+		output(getTypeSignature4(paramTypes[1], false, paramTypes[1] != paramTypes64[1]));
 		output(" **)arg1)[arg0])");
 		paramStart = 1;
 	} else if (methodData.getFlag(FLAG_CPP) || methodData.getFlag(FLAG_SETTER) || methodData.getFlag(FLAG_GETTER) || methodData.getFlag(FLAG_ADDER)) {
@@ -737,7 +875,7 @@
 		}
 		if (methodData.getFlag(Flags.FLAG_CAST)) {
 			output("((");
-			output(getTypeSignature2(returnType));
+			output(getTypeSignature2(returnType, returnType != returnType64));
 			output(" (*)(");
 			for (int i = 0; i < paramTypes.length; i++) {
 				if (i != 0) output(", ");
@@ -749,7 +887,7 @@
 					if (cast.endsWith(")")) cast = cast.substring(0, cast.length() - 1);
 					output(cast);
 				} else {
-					output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT)));
+					output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT), paramType != paramTypes64[i]));
 				}
 			}
 			output("))");
@@ -771,7 +909,7 @@
 	if (methodData.getFlag(FLAG_SETTER)) output(" = ");
 	if (methodData.getFlag(FLAG_ADDER)) output(" += ");
 	if (!methodData.getFlag(FLAG_GETTER)) {
-		generateFunctionCallRightSide(method, methodData, paramTypes, paramStart);
+		generateFunctionCallRightSide(method, methodData, paramTypes, paramTypes64, paramStart);
 	}
 	if (methodData.getFlag(FLAG_GCNEW) || methodData.getFlag(FLAG_GCOBJECT)) {
 		output(")");
@@ -788,7 +926,7 @@
 		outputln("\t\t*copy = temp;");
 		output("\t\trc = ");
 		output("(");
-		output(getTypeSignature2(returnType));
+		output(getTypeSignature2(returnType, returnType != returnType64));
 		output(")");
 		outputln("copy;");
 		outputln("\t}");
@@ -796,7 +934,7 @@
 	if (objc_struct) {
 		outputln("\t} else {");
 		output("\t\t*lparg0 = (*(");
-		output(getTypeSignature4(paramTypes[0], true));
+		output(getTypeSignature4(paramTypes[0], true, paramTypes[0] != paramTypes64[0]));
 		output(" (*)(");
 		for (int i = 1; i < paramTypes.length; i++) {
 			if (i != 1) output(", ");
@@ -808,24 +946,24 @@
 				if (cast.endsWith(")")) cast = cast.substring(0, cast.length() - 1);
 				output(cast);
 			} else {
-				output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT)));
+				output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT), paramType != paramTypes64[i]));
 			}
 		}
 		output("))objc_msgSend)");
-		generateFunctionCallRightSide(method, methodData, paramTypes, 1);
+		generateFunctionCallRightSide(method, methodData, paramTypes, paramTypes64, 1);
 		outputln(";");
 		outputln("\t}");
 	}
 }
 
-void generateReturn(Method method, Class returnType, boolean needsReturn) {
+void generateReturn(Method method, Class returnType, Class returnType64, boolean needsReturn) {
 	if (needsReturn && returnType != Void.TYPE) {
 		outputln("\treturn rc;");
 	}
 }
 
-void generateMemmove(Method method, String function, Class[] paramTypes) {
-	generateEnterMacro(method, function);
+void generateMemmove(Method method, String function, Class[] paramTypes, String function64, Class[] paramTypes64) {
+	generateEnterMacro(method, function, function64);
 	output("\t");
 	boolean get = paramTypes[0].isPrimitive();
 	String className = getClassName(paramTypes[get ? 1 : 0]);
@@ -835,10 +973,10 @@
 	output(className);
 	output(get ? " *)arg0)" : " *)arg1)");
 	outputln(";");
-	generateExitMacro(method, function);	
+	generateExitMacro(method, function, function64);	
 }
 
-void generateFunctionBody(Method method, MethodData methodData, String function, Class[] paramTypes, Class returnType) {
+void generateFunctionBody(Method method, MethodData methodData, String function, Class[] paramTypes, Class returnType, String function64, Class[] paramTypes64, Class returnType64) {
 	outputln("{");
 	
 	/* Custom GTK memmoves. */
@@ -846,28 +984,28 @@
 	if (name.startsWith("_")) name = name.substring(1);
 	boolean isMemove = (name.equals("memmove") || name.equals("MoveMemory")) && paramTypes.length == 2 && returnType == Void.TYPE;
 	if (isMemove) {
-		generateMemmove(method, function, paramTypes);
+		generateMemmove(method, function, paramTypes, function64, paramTypes64);
 	} else {
-		boolean needsReturn = generateLocalVars(method, paramTypes, returnType);
-		generateEnterMacro(method, function);
-		boolean genFailTag = generateGetters(method, paramTypes);
+		boolean needsReturn = generateLocalVars(method, paramTypes, returnType, paramTypes64, returnType64);
+		generateEnterMacro(method, function, function64);
+		boolean genFailTag = generateGetters(method, paramTypes, paramTypes64);
 		if (methodData.getFlag(FLAG_DYNAMIC)) {
-			generateDynamicFunctionCall(method, methodData, paramTypes, returnType, needsReturn);
+			generateDynamicFunctionCall(method, methodData, paramTypes, returnType, paramTypes64, returnType64, needsReturn);
 		} else {
-			generateFunctionCall(method, methodData, paramTypes, returnType, needsReturn);
+			generateFunctionCall(method, methodData, paramTypes, returnType, paramTypes64, returnType64, needsReturn);
 		}
 		if (genFailTag) outputln("fail:");
-		generateSetters(method, paramTypes);
-		generateExitMacro(method, function);
-		generateReturn(method, returnType, needsReturn);
+		generateSetters(method, paramTypes, paramTypes64);
+		generateExitMacro(method, function, function64);
+		generateReturn(method, returnType, returnType64, needsReturn);
 	}
 	
 	outputln("}");
 }
 
-void generateFunctionPrototype(Method method, String function, Class[] paramTypes, Class returnType, boolean singleLine) {
+void generateFunctionPrototype(Method method, String function, Class[] paramTypes, Class returnType, Class[] paramTypes64, Class returnType64, boolean singleLine) {
 	output("JNIEXPORT ");
-	output(getTypeSignature2(returnType));
+	output(getTypeSignature2(returnType, returnType != returnType64));
 	output(" JNICALL ");
 	output(getClassName(method.getDeclaringClass()));
 	output("_NATIVE(");
@@ -888,19 +1026,27 @@
 	for (int i = 0; i < paramTypes.length; i++) {
 		Class paramType = paramTypes[i];
 		output(", ");
-		output(getTypeSignature2(paramType));
+		output(getTypeSignature2(paramType, paramType != paramTypes64[i]));
 		output(" arg" + i);
 	}
 	output(")");
 	if (!singleLine) outputln();
 }
 
-void generateSourceStart(String function) {
-	output("#ifndef NO_");
-	outputln(function);
+void generateSourceStart(String function, String function64) {
+	if (function64 == null || function.equals(function64)) {
+		output("#ifndef NO_");
+		outputln(function);
+	} else {
+		output("#if (!defined(NO_");
+		output(function);
+		output(") && !defined(SWT_PTR_SIZE_64)) || (!defined(");
+		output(function64);
+		outputln(") && defined(SWT_PTR_SIZE_64))");
+	}
 }
 
-void generateSourceEnd(String function) {
+void generateSourceEnd(String function, String function64) {
 	outputln("#endif");
 }
 
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StructsGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StructsGenerator.java
index fa8d846..b592f6c 100644
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StructsGenerator.java
+++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/StructsGenerator.java
@@ -14,7 +14,6 @@
 import java.lang.reflect.Modifier;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.StringTokenizer;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;