Xmas

package jp.sourceforge.winapi;

public class WinApi {
	public static native boolean EnumWindows(WNDENUMPROC lpEnumFunc, Object lParam);
	static {
		System.loadLibrary("winapi");
	}
}
package jp.sourceforge.winapi;

public interface WNDENUMPROC {
	boolean EnumWindowsProc(int hwnd, Object lParam);
}
typedef struct tagWNDENUMPROCPARAM {
	JNIEnv *jnienv;
	jobject jEnumFunc;
	jobject jParam;
} WNDENUMPROCPARAM;
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
	WNDENUMPROCPARAM* param = (WNDENUMPROCPARAM*) lParam;
	JNIEnv *jnienv = param->jnienv;
	jclass clazz = jnienv->GetObjectClass(param->jEnumFunc);
	jmethodID methodID = jnienv->GetMethodID(clazz, "EnumWindowsProc", "(ILjava/lang/Object;)Z");
	jboolean rc = jnienv->CallBooleanMethod(param->jEnumFunc, methodID, (jint)hwnd, param->jParam);
	return (BOOL) rc;
}

/*
 * Class:     jp_sourceforge_winapi_WinApi
 * Method:    EnumWindows
 * Signature: (Ljp/sourceforge/winapi/WNDENUMPROC;Ljava/lang/Object;)Z
 */
JNIEXPORT jboolean JNICALL Java_jp_sourceforge_winapi_WinApi_EnumWindows
  (JNIEnv *jnienv, jclass, jobject jEnumFunc, jobject jParam)
{
	WNDENUMPROCPARAM param;
	param.jnienv    = jnienv;
	param.jEnumFunc = jEnumFunc;
	param.jParam    = jParam;
	BOOL rc = EnumWindows(EnumWindowsProc, (LPARAM)&param);
	return (jboolean)rc;
}