/*******************************************************************************
 * Copyright (c) 2000, 2020 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *    IBM Corporation - initial API and implementation
 *******************************************************************************/

/* Note: This file was auto-generated by org.eclipse.swt.tools.internal.JNIGenerator */
/* DO NOT EDIT - your changes will be lost. */

#include "swt.h"
#include "os_structs.h"
#include "os_stats.h"

#ifndef OS_NATIVE
#define OS_NATIVE(func) Java_org_eclipse_swt_internal_cocoa_OS_##func
#endif

#ifndef NO_AcquireRootMenu
JNIEXPORT jlong JNICALL OS_NATIVE(AcquireRootMenu)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, AcquireRootMenu_FUNC);
/*
	rc = (jlong)AcquireRootMenu();
*/
	{
		OS_LOAD_FUNCTION(fp, AcquireRootMenu)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	OS_NATIVE_EXIT(env, that, AcquireRootMenu_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1NSTextAttachmentCell_1attachment
static jintLong CALLBACK_1NSTextAttachmentCell_1attachment;
static id proc_CALLBACK_1NSTextAttachmentCell_1attachment(id arg0, SEL arg1) {
	id* lprc = ((id* (*)(id, SEL))CALLBACK_1NSTextAttachmentCell_1attachment)(arg0, arg1);
	id rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(id));
	}
	return rc;
}
static jintLong CALLBACK_NSTextAttachmentCell_attachment(jintLong func) {
	CALLBACK_1NSTextAttachmentCell_1attachment = func;
	return (jintLong)proc_CALLBACK_1NSTextAttachmentCell_1attachment;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1NSTextAttachmentCell_1attachment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1NSTextAttachmentCell_1attachment_FUNC);
	rc = (jlong)CALLBACK_NSTextAttachmentCell_attachment(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1NSTextAttachmentCell_1attachment_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1NSTextAttachmentCell_1cellSize
static jintLong CALLBACK_1NSTextAttachmentCell_1cellSize;
static NSSize proc_CALLBACK_1NSTextAttachmentCell_1cellSize(id arg0, SEL arg1) {
	NSSize* lprc = ((NSSize* (*)(id, SEL))CALLBACK_1NSTextAttachmentCell_1cellSize)(arg0, arg1);
	NSSize rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSSize));
	}
	return rc;
}
static jintLong CALLBACK_NSTextAttachmentCell_cellSize(jintLong func) {
	CALLBACK_1NSTextAttachmentCell_1cellSize = func;
	return (jintLong)proc_CALLBACK_1NSTextAttachmentCell_1cellSize;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1NSTextAttachmentCell_1cellSize)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1NSTextAttachmentCell_1cellSize_FUNC);
	rc = (jlong)CALLBACK_NSTextAttachmentCell_cellSize(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1NSTextAttachmentCell_1cellSize_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1accessibilityHitTest_1
static jintLong CALLBACK_1accessibilityHitTest_1;
static id proc_CALLBACK_1accessibilityHitTest_1(id arg0, SEL arg1, NSPoint arg2) {
	return ((id (*)(id, SEL, NSPoint*))CALLBACK_1accessibilityHitTest_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_accessibilityHitTest_(jintLong func) {
	CALLBACK_1accessibilityHitTest_1 = func;
	return (jintLong)proc_CALLBACK_1accessibilityHitTest_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1accessibilityHitTest_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1accessibilityHitTest_1_FUNC);
	rc = (jlong)CALLBACK_accessibilityHitTest_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1accessibilityHitTest_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1attributedSubstringFromRange_1
static jintLong CALLBACK_1attributedSubstringFromRange_1;
static NSAttributedString* proc_CALLBACK_1attributedSubstringFromRange_1(id arg0, SEL arg1, NSRange arg2) {
	return ((NSAttributedString* (*)(id, SEL, NSRange*))CALLBACK_1attributedSubstringFromRange_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_attributedSubstringFromRange_(jintLong func) {
	CALLBACK_1attributedSubstringFromRange_1 = func;
	return (jintLong)proc_CALLBACK_1attributedSubstringFromRange_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1attributedSubstringFromRange_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1attributedSubstringFromRange_1_FUNC);
	rc = (jlong)CALLBACK_attributedSubstringFromRange_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1attributedSubstringFromRange_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1
static jintLong CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1;
static void proc_CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1(id arg0, SEL arg1, NSRect arg2, NSBitmapImageRep* arg3) {
	((void (*)(id, SEL, NSRect*, NSBitmapImageRep*))CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1)(arg0, arg1, &arg2, arg3);
}
static jintLong CALLBACK_cacheDisplayInRect_toBitmapImageRep_(jintLong func) {
	CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1 = func;
	return (jintLong)proc_CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1_FUNC);
	rc = (jlong)CALLBACK_cacheDisplayInRect_toBitmapImageRep_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1cacheDisplayInRect_1toBitmapImageRep_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1canDragRowsWithIndexes_1atPoint_1
static jintLong CALLBACK_1canDragRowsWithIndexes_1atPoint_1;
static BOOL proc_CALLBACK_1canDragRowsWithIndexes_1atPoint_1(id arg0, SEL arg1, NSIndexSet* arg2, NSPoint arg3) {
	return ((BOOL (*)(id, SEL, NSIndexSet*, NSPoint*))CALLBACK_1canDragRowsWithIndexes_1atPoint_1)(arg0, arg1, arg2, &arg3);
}
static jintLong CALLBACK_canDragRowsWithIndexes_atPoint_(jintLong func) {
	CALLBACK_1canDragRowsWithIndexes_1atPoint_1 = func;
	return (jintLong)proc_CALLBACK_1canDragRowsWithIndexes_1atPoint_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1canDragRowsWithIndexes_1atPoint_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1canDragRowsWithIndexes_1atPoint_1_FUNC);
	rc = (jlong)CALLBACK_canDragRowsWithIndexes_atPoint_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1canDragRowsWithIndexes_1atPoint_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1cellBaselineOffset
static jintLong CALLBACK_1cellBaselineOffset;
static NSPoint proc_CALLBACK_1cellBaselineOffset(id arg0, SEL arg1) {
	NSPoint* lprc = ((NSPoint* (*)(id, SEL))CALLBACK_1cellBaselineOffset)(arg0, arg1);
	NSPoint rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSPoint));
	}
	return rc;
}
static jintLong CALLBACK_cellBaselineOffset(jintLong func) {
	CALLBACK_1cellBaselineOffset = func;
	return (jintLong)proc_CALLBACK_1cellBaselineOffset;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1cellBaselineOffset)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1cellBaselineOffset_FUNC);
	rc = (jlong)CALLBACK_cellBaselineOffset(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1cellBaselineOffset_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1cellSize
static jintLong CALLBACK_1cellSize;
static NSSize proc_CALLBACK_1cellSize(id arg0, SEL arg1) {
	NSSize* lprc = ((NSSize* (*)(id, SEL))CALLBACK_1cellSize)(arg0, arg1);
	NSSize rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSSize));
	}
	return rc;
}
static jintLong CALLBACK_cellSize(jintLong func) {
	CALLBACK_1cellSize = func;
	return (jintLong)proc_CALLBACK_1cellSize;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1cellSize)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1cellSize_FUNC);
	rc = (jlong)CALLBACK_cellSize(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1cellSize_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1cellSizeForBounds_1
static jintLong CALLBACK_1cellSizeForBounds_1;
static NSSize proc_CALLBACK_1cellSizeForBounds_1(id arg0, SEL arg1, NSRect arg2) {
	NSSize* lprc = ((NSSize* (*)(id, SEL, NSRect*))CALLBACK_1cellSizeForBounds_1)(arg0, arg1, &arg2);
	NSSize rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSSize));
	}
	return rc;
}
static jintLong CALLBACK_cellSizeForBounds_(jintLong func) {
	CALLBACK_1cellSizeForBounds_1 = func;
	return (jintLong)proc_CALLBACK_1cellSizeForBounds_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1cellSizeForBounds_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1cellSizeForBounds_1_FUNC);
	rc = (jlong)CALLBACK_cellSizeForBounds_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1cellSizeForBounds_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1characterIndexForPoint_1
static jintLong CALLBACK_1characterIndexForPoint_1;
static NSUInteger proc_CALLBACK_1characterIndexForPoint_1(id arg0, SEL arg1, NSPoint arg2) {
	return ((NSUInteger (*)(id, SEL, NSPoint*))CALLBACK_1characterIndexForPoint_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_characterIndexForPoint_(jintLong func) {
	CALLBACK_1characterIndexForPoint_1 = func;
	return (jintLong)proc_CALLBACK_1characterIndexForPoint_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1characterIndexForPoint_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1characterIndexForPoint_1_FUNC);
	rc = (jlong)CALLBACK_characterIndexForPoint_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1characterIndexForPoint_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1columnAtPoint_1
static jintLong CALLBACK_1columnAtPoint_1;
static NSInteger proc_CALLBACK_1columnAtPoint_1(id arg0, SEL arg1, NSPoint arg2) {
	return ((NSInteger (*)(id, SEL, NSPoint*))CALLBACK_1columnAtPoint_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_columnAtPoint_(jintLong func) {
	CALLBACK_1columnAtPoint_1 = func;
	return (jintLong)proc_CALLBACK_1columnAtPoint_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1columnAtPoint_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1columnAtPoint_1_FUNC);
	rc = (jlong)CALLBACK_columnAtPoint_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1columnAtPoint_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1draggedImage_1endedAt_1operation_1
static jintLong CALLBACK_1draggedImage_1endedAt_1operation_1;
static void proc_CALLBACK_1draggedImage_1endedAt_1operation_1(id arg0, SEL arg1, NSImage* arg2, NSPoint arg3, NSDragOperation arg4) {
	((void (*)(id, SEL, NSImage*, NSPoint*, NSDragOperation))CALLBACK_1draggedImage_1endedAt_1operation_1)(arg0, arg1, arg2, &arg3, arg4);
}
static jintLong CALLBACK_draggedImage_endedAt_operation_(jintLong func) {
	CALLBACK_1draggedImage_1endedAt_1operation_1 = func;
	return (jintLong)proc_CALLBACK_1draggedImage_1endedAt_1operation_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1draggedImage_1endedAt_1operation_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1draggedImage_1endedAt_1operation_1_FUNC);
	rc = (jlong)CALLBACK_draggedImage_endedAt_operation_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1draggedImage_1endedAt_1operation_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawBackgroundInClipRect_1
static jintLong CALLBACK_1drawBackgroundInClipRect_1;
static void proc_CALLBACK_1drawBackgroundInClipRect_1(id arg0, SEL arg1, NSRect arg2) {
	((void (*)(id, SEL, NSRect*))CALLBACK_1drawBackgroundInClipRect_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_drawBackgroundInClipRect_(jintLong func) {
	CALLBACK_1drawBackgroundInClipRect_1 = func;
	return (jintLong)proc_CALLBACK_1drawBackgroundInClipRect_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawBackgroundInClipRect_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawBackgroundInClipRect_1_FUNC);
	rc = (jlong)CALLBACK_drawBackgroundInClipRect_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawBackgroundInClipRect_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawBezelWithFrame_1inView_1
static jintLong CALLBACK_1drawBezelWithFrame_1inView_1;
static void proc_CALLBACK_1drawBezelWithFrame_1inView_1(id arg0, SEL arg1, NSRect arg2, NSView* arg3) {
	((void (*)(id, SEL, NSRect*, NSView*))CALLBACK_1drawBezelWithFrame_1inView_1)(arg0, arg1, &arg2, arg3);
}
static jintLong CALLBACK_drawBezelWithFrame_inView_(jintLong func) {
	CALLBACK_1drawBezelWithFrame_1inView_1 = func;
	return (jintLong)proc_CALLBACK_1drawBezelWithFrame_1inView_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawBezelWithFrame_1inView_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawBezelWithFrame_1inView_1_FUNC);
	rc = (jlong)CALLBACK_drawBezelWithFrame_inView_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawBezelWithFrame_1inView_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawImage_1withFrame_1inView_1
static jintLong CALLBACK_1drawImage_1withFrame_1inView_1;
static void proc_CALLBACK_1drawImage_1withFrame_1inView_1(id arg0, SEL arg1, NSImage* arg2, NSRect arg3, NSView* arg4) {
	((void (*)(id, SEL, NSImage*, NSRect*, NSView*))CALLBACK_1drawImage_1withFrame_1inView_1)(arg0, arg1, arg2, &arg3, arg4);
}
static jintLong CALLBACK_drawImage_withFrame_inView_(jintLong func) {
	CALLBACK_1drawImage_1withFrame_1inView_1 = func;
	return (jintLong)proc_CALLBACK_1drawImage_1withFrame_1inView_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawImage_1withFrame_1inView_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawImage_1withFrame_1inView_1_FUNC);
	rc = (jlong)CALLBACK_drawImage_withFrame_inView_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawImage_1withFrame_1inView_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawInteriorWithFrame_1inView_1
static jintLong CALLBACK_1drawInteriorWithFrame_1inView_1;
static void proc_CALLBACK_1drawInteriorWithFrame_1inView_1(id arg0, SEL arg1, NSRect arg2, NSView* arg3) {
	((void (*)(id, SEL, NSRect*, NSView*))CALLBACK_1drawInteriorWithFrame_1inView_1)(arg0, arg1, &arg2, arg3);
}
static jintLong CALLBACK_drawInteriorWithFrame_inView_(jintLong func) {
	CALLBACK_1drawInteriorWithFrame_1inView_1 = func;
	return (jintLong)proc_CALLBACK_1drawInteriorWithFrame_1inView_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawInteriorWithFrame_1inView_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawInteriorWithFrame_1inView_1_FUNC);
	rc = (jlong)CALLBACK_drawInteriorWithFrame_inView_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawInteriorWithFrame_1inView_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawLabel_1inRect_1
static jintLong CALLBACK_1drawLabel_1inRect_1;
static void proc_CALLBACK_1drawLabel_1inRect_1(id arg0, SEL arg1, BOOL arg2, NSRect arg3) {
	((void (*)(id, SEL, BOOL, NSRect*))CALLBACK_1drawLabel_1inRect_1)(arg0, arg1, arg2, &arg3);
}
static jintLong CALLBACK_drawLabel_inRect_(jintLong func) {
	CALLBACK_1drawLabel_1inRect_1 = func;
	return (jintLong)proc_CALLBACK_1drawLabel_1inRect_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawLabel_1inRect_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawLabel_1inRect_1_FUNC);
	rc = (jlong)CALLBACK_drawLabel_inRect_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawLabel_1inRect_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawRect_1
static jintLong CALLBACK_1drawRect_1;
static void proc_CALLBACK_1drawRect_1(id arg0, SEL arg1, NSRect arg2) {
	((void (*)(id, SEL, NSRect*))CALLBACK_1drawRect_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_drawRect_(jintLong func) {
	CALLBACK_1drawRect_1 = func;
	return (jintLong)proc_CALLBACK_1drawRect_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawRect_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawRect_1_FUNC);
	rc = (jlong)CALLBACK_drawRect_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawRect_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawTitle_1withFrame_1inView_1
static jintLong CALLBACK_1drawTitle_1withFrame_1inView_1;
static NSRect proc_CALLBACK_1drawTitle_1withFrame_1inView_1(id arg0, SEL arg1, NSAttributedString* arg2, NSRect arg3, NSView* arg4) {
	NSRect* lprc = ((NSRect* (*)(id, SEL, NSAttributedString*, NSRect*, NSView*))CALLBACK_1drawTitle_1withFrame_1inView_1)(arg0, arg1, arg2, &arg3, arg4);
	NSRect rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRect));
	}
	return rc;
}
static jintLong CALLBACK_drawTitle_withFrame_inView_(jintLong func) {
	CALLBACK_1drawTitle_1withFrame_1inView_1 = func;
	return (jintLong)proc_CALLBACK_1drawTitle_1withFrame_1inView_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawTitle_1withFrame_1inView_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawTitle_1withFrame_1inView_1_FUNC);
	rc = (jlong)CALLBACK_drawTitle_withFrame_inView_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawTitle_1withFrame_1inView_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawViewBackgroundInRect_1
static jintLong CALLBACK_1drawViewBackgroundInRect_1;
static void proc_CALLBACK_1drawViewBackgroundInRect_1(id arg0, SEL arg1, NSRect arg2) {
	((void (*)(id, SEL, NSRect*))CALLBACK_1drawViewBackgroundInRect_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_drawViewBackgroundInRect_(jintLong func) {
	CALLBACK_1drawViewBackgroundInRect_1 = func;
	return (jintLong)proc_CALLBACK_1drawViewBackgroundInRect_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawViewBackgroundInRect_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawViewBackgroundInRect_1_FUNC);
	rc = (jlong)CALLBACK_drawViewBackgroundInRect_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawViewBackgroundInRect_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1drawWithExpansionFrame_1inView_1
static jintLong CALLBACK_1drawWithExpansionFrame_1inView_1;
static void proc_CALLBACK_1drawWithExpansionFrame_1inView_1(id arg0, SEL arg1, NSRect arg2, NSView* arg3) {
	((void (*)(id, SEL, NSRect*, NSView*))CALLBACK_1drawWithExpansionFrame_1inView_1)(arg0, arg1, &arg2, arg3);
}
static jintLong CALLBACK_drawWithExpansionFrame_inView_(jintLong func) {
	CALLBACK_1drawWithExpansionFrame_1inView_1 = func;
	return (jintLong)proc_CALLBACK_1drawWithExpansionFrame_1inView_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1drawWithExpansionFrame_1inView_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1drawWithExpansionFrame_1inView_1_FUNC);
	rc = (jlong)CALLBACK_drawWithExpansionFrame_inView_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1drawWithExpansionFrame_1inView_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1expansionFrameWithFrame_1inView_1
static jintLong CALLBACK_1expansionFrameWithFrame_1inView_1;
static NSRect proc_CALLBACK_1expansionFrameWithFrame_1inView_1(id arg0, SEL arg1, NSRect arg2, NSView* arg3) {
	NSRect* lprc = ((NSRect* (*)(id, SEL, NSRect*, NSView*))CALLBACK_1expansionFrameWithFrame_1inView_1)(arg0, arg1, &arg2, arg3);
	NSRect rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRect));
	}
	return rc;
}
static jintLong CALLBACK_expansionFrameWithFrame_inView_(jintLong func) {
	CALLBACK_1expansionFrameWithFrame_1inView_1 = func;
	return (jintLong)proc_CALLBACK_1expansionFrameWithFrame_1inView_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1expansionFrameWithFrame_1inView_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1expansionFrameWithFrame_1inView_1_FUNC);
	rc = (jlong)CALLBACK_expansionFrameWithFrame_inView_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1expansionFrameWithFrame_1inView_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1firstRectForCharacterRange_1
static jintLong CALLBACK_1firstRectForCharacterRange_1;
static NSRect proc_CALLBACK_1firstRectForCharacterRange_1(id arg0, SEL arg1, NSRange arg2) {
	NSRect* lprc = ((NSRect* (*)(id, SEL, NSRange*))CALLBACK_1firstRectForCharacterRange_1)(arg0, arg1, &arg2);
	NSRect rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRect));
	}
	return rc;
}
static jintLong CALLBACK_firstRectForCharacterRange_(jintLong func) {
	CALLBACK_1firstRectForCharacterRange_1 = func;
	return (jintLong)proc_CALLBACK_1firstRectForCharacterRange_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1firstRectForCharacterRange_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1firstRectForCharacterRange_1_FUNC);
	rc = (jlong)CALLBACK_firstRectForCharacterRange_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1firstRectForCharacterRange_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1focusRingMaskBoundsForFrame_1inView_1
static jintLong CALLBACK_1focusRingMaskBoundsForFrame_1inView_1;
static NSRect proc_CALLBACK_1focusRingMaskBoundsForFrame_1inView_1(id arg0, SEL arg1, NSRect arg2, NSView* arg3) {
	NSRect* lprc = ((NSRect* (*)(id, SEL, NSRect*, NSView*))CALLBACK_1focusRingMaskBoundsForFrame_1inView_1)(arg0, arg1, &arg2, arg3);
	NSRect rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRect));
	}
	return rc;
}
static jintLong CALLBACK_focusRingMaskBoundsForFrame_inView_(jintLong func) {
	CALLBACK_1focusRingMaskBoundsForFrame_1inView_1 = func;
	return (jintLong)proc_CALLBACK_1focusRingMaskBoundsForFrame_1inView_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1focusRingMaskBoundsForFrame_1inView_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1focusRingMaskBoundsForFrame_1inView_1_FUNC);
	rc = (jlong)CALLBACK_focusRingMaskBoundsForFrame_inView_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1focusRingMaskBoundsForFrame_1inView_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1headerRectOfColumn_1
static jintLong CALLBACK_1headerRectOfColumn_1;
static NSRect proc_CALLBACK_1headerRectOfColumn_1(id arg0, SEL arg1, NSInteger arg2) {
	NSRect* lprc = ((NSRect* (*)(id, SEL, NSInteger))CALLBACK_1headerRectOfColumn_1)(arg0, arg1, arg2);
	NSRect rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRect));
	}
	return rc;
}
static jintLong CALLBACK_headerRectOfColumn_(jintLong func) {
	CALLBACK_1headerRectOfColumn_1 = func;
	return (jintLong)proc_CALLBACK_1headerRectOfColumn_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1headerRectOfColumn_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1headerRectOfColumn_1_FUNC);
	rc = (jlong)CALLBACK_headerRectOfColumn_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1headerRectOfColumn_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1highlightSelectionInClipRect_1
static jintLong CALLBACK_1highlightSelectionInClipRect_1;
static void proc_CALLBACK_1highlightSelectionInClipRect_1(id arg0, SEL arg1, NSRect arg2) {
	((void (*)(id, SEL, NSRect*))CALLBACK_1highlightSelectionInClipRect_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_highlightSelectionInClipRect_(jintLong func) {
	CALLBACK_1highlightSelectionInClipRect_1 = func;
	return (jintLong)proc_CALLBACK_1highlightSelectionInClipRect_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1highlightSelectionInClipRect_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1highlightSelectionInClipRect_1_FUNC);
	rc = (jlong)CALLBACK_highlightSelectionInClipRect_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1highlightSelectionInClipRect_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1hitTestForEvent_1inRect_1ofView_1
static jintLong CALLBACK_1hitTestForEvent_1inRect_1ofView_1;
static NSCellHitResult proc_CALLBACK_1hitTestForEvent_1inRect_1ofView_1(id arg0, SEL arg1, NSEvent* arg2, NSRect arg3, NSView* arg4) {
	return ((NSCellHitResult (*)(id, SEL, NSEvent*, NSRect*, NSView*))CALLBACK_1hitTestForEvent_1inRect_1ofView_1)(arg0, arg1, arg2, &arg3, arg4);
}
static jintLong CALLBACK_hitTestForEvent_inRect_ofView_(jintLong func) {
	CALLBACK_1hitTestForEvent_1inRect_1ofView_1 = func;
	return (jintLong)proc_CALLBACK_1hitTestForEvent_1inRect_1ofView_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1hitTestForEvent_1inRect_1ofView_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1hitTestForEvent_1inRect_1ofView_1_FUNC);
	rc = (jlong)CALLBACK_hitTestForEvent_inRect_ofView_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1hitTestForEvent_1inRect_1ofView_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1hitTest_1
static jintLong CALLBACK_1hitTest_1;
static NSView* proc_CALLBACK_1hitTest_1(id arg0, SEL arg1, NSPoint arg2) {
	return ((NSView* (*)(id, SEL, NSPoint*))CALLBACK_1hitTest_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_hitTest_(jintLong func) {
	CALLBACK_1hitTest_1 = func;
	return (jintLong)proc_CALLBACK_1hitTest_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1hitTest_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1hitTest_1_FUNC);
	rc = (jlong)CALLBACK_hitTest_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1hitTest_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1imageRectForBounds_1
static jintLong CALLBACK_1imageRectForBounds_1;
static NSRect proc_CALLBACK_1imageRectForBounds_1(id arg0, SEL arg1, NSRect arg2) {
	NSRect* lprc = ((NSRect* (*)(id, SEL, NSRect*))CALLBACK_1imageRectForBounds_1)(arg0, arg1, &arg2);
	NSRect rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRect));
	}
	return rc;
}
static jintLong CALLBACK_imageRectForBounds_(jintLong func) {
	CALLBACK_1imageRectForBounds_1 = func;
	return (jintLong)proc_CALLBACK_1imageRectForBounds_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1imageRectForBounds_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1imageRectForBounds_1_FUNC);
	rc = (jlong)CALLBACK_imageRectForBounds_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1imageRectForBounds_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1markedRange
static jintLong CALLBACK_1markedRange;
static NSRange proc_CALLBACK_1markedRange(id arg0, SEL arg1) {
	NSRange* lprc = ((NSRange* (*)(id, SEL))CALLBACK_1markedRange)(arg0, arg1);
	NSRange rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRange));
	}
	return rc;
}
static jintLong CALLBACK_markedRange(jintLong func) {
	CALLBACK_1markedRange = func;
	return (jintLong)proc_CALLBACK_1markedRange;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1markedRange)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1markedRange_FUNC);
	rc = (jlong)CALLBACK_markedRange(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1markedRange_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1scrollClipView_1toPoint_1
static jintLong CALLBACK_1scrollClipView_1toPoint_1;
static void proc_CALLBACK_1scrollClipView_1toPoint_1(id arg0, SEL arg1, NSClipView* arg2, NSPoint arg3) {
	((void (*)(id, SEL, NSClipView*, NSPoint*))CALLBACK_1scrollClipView_1toPoint_1)(arg0, arg1, arg2, &arg3);
}
static jintLong CALLBACK_scrollClipView_toPoint_(jintLong func) {
	CALLBACK_1scrollClipView_1toPoint_1 = func;
	return (jintLong)proc_CALLBACK_1scrollClipView_1toPoint_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1scrollClipView_1toPoint_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1scrollClipView_1toPoint_1_FUNC);
	rc = (jlong)CALLBACK_scrollClipView_toPoint_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1scrollClipView_1toPoint_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1selectedRange
static jintLong CALLBACK_1selectedRange;
static NSRange proc_CALLBACK_1selectedRange(id arg0, SEL arg1) {
	NSRange* lprc = ((NSRange* (*)(id, SEL))CALLBACK_1selectedRange)(arg0, arg1);
	NSRange rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRange));
	}
	return rc;
}
static jintLong CALLBACK_selectedRange(jintLong func) {
	CALLBACK_1selectedRange = func;
	return (jintLong)proc_CALLBACK_1selectedRange;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1selectedRange)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1selectedRange_FUNC);
	rc = (jlong)CALLBACK_selectedRange(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1selectedRange_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1setFrameOrigin_1
static jintLong CALLBACK_1setFrameOrigin_1;
static void proc_CALLBACK_1setFrameOrigin_1(id arg0, SEL arg1, NSPoint arg2) {
	((void (*)(id, SEL, NSPoint*))CALLBACK_1setFrameOrigin_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_setFrameOrigin_(jintLong func) {
	CALLBACK_1setFrameOrigin_1 = func;
	return (jintLong)proc_CALLBACK_1setFrameOrigin_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1setFrameOrigin_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1setFrameOrigin_1_FUNC);
	rc = (jlong)CALLBACK_setFrameOrigin_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1setFrameOrigin_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1setFrameSize_1
static jintLong CALLBACK_1setFrameSize_1;
static void proc_CALLBACK_1setFrameSize_1(id arg0, SEL arg1, NSSize arg2) {
	((void (*)(id, SEL, NSSize*))CALLBACK_1setFrameSize_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_setFrameSize_(jintLong func) {
	CALLBACK_1setFrameSize_1 = func;
	return (jintLong)proc_CALLBACK_1setFrameSize_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1setFrameSize_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1setFrameSize_1_FUNC);
	rc = (jlong)CALLBACK_setFrameSize_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1setFrameSize_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1setMarkedText_1selectedRange_1
static jintLong CALLBACK_1setMarkedText_1selectedRange_1;
static void proc_CALLBACK_1setMarkedText_1selectedRange_1(id arg0, SEL arg1, id arg2, NSRange arg3) {
	((void (*)(id, SEL, id, NSRange*))CALLBACK_1setMarkedText_1selectedRange_1)(arg0, arg1, arg2, &arg3);
}
static jintLong CALLBACK_setMarkedText_selectedRange_(jintLong func) {
	CALLBACK_1setMarkedText_1selectedRange_1 = func;
	return (jintLong)proc_CALLBACK_1setMarkedText_1selectedRange_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1setMarkedText_1selectedRange_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1setMarkedText_1selectedRange_1_FUNC);
	rc = (jlong)CALLBACK_setMarkedText_selectedRange_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1setMarkedText_1selectedRange_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1setNeedsDisplayInRect_1
static jintLong CALLBACK_1setNeedsDisplayInRect_1;
static void proc_CALLBACK_1setNeedsDisplayInRect_1(id arg0, SEL arg1, NSRect arg2) {
	((void (*)(id, SEL, NSRect*))CALLBACK_1setNeedsDisplayInRect_1)(arg0, arg1, &arg2);
}
static jintLong CALLBACK_setNeedsDisplayInRect_(jintLong func) {
	CALLBACK_1setNeedsDisplayInRect_1 = func;
	return (jintLong)proc_CALLBACK_1setNeedsDisplayInRect_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1setNeedsDisplayInRect_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1setNeedsDisplayInRect_1_FUNC);
	rc = (jlong)CALLBACK_setNeedsDisplayInRect_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1setNeedsDisplayInRect_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1shouldChangeTextInRange_1replacementString_1
static jintLong CALLBACK_1shouldChangeTextInRange_1replacementString_1;
static BOOL proc_CALLBACK_1shouldChangeTextInRange_1replacementString_1(id arg0, SEL arg1, NSRange arg2, NSString* arg3) {
	return ((BOOL (*)(id, SEL, NSRange*, NSString*))CALLBACK_1shouldChangeTextInRange_1replacementString_1)(arg0, arg1, &arg2, arg3);
}
static jintLong CALLBACK_shouldChangeTextInRange_replacementString_(jintLong func) {
	CALLBACK_1shouldChangeTextInRange_1replacementString_1 = func;
	return (jintLong)proc_CALLBACK_1shouldChangeTextInRange_1replacementString_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1shouldChangeTextInRange_1replacementString_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1shouldChangeTextInRange_1replacementString_1_FUNC);
	rc = (jlong)CALLBACK_shouldChangeTextInRange_replacementString_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1shouldChangeTextInRange_1replacementString_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1sizeOfLabel_1
static jintLong CALLBACK_1sizeOfLabel_1;
static NSSize proc_CALLBACK_1sizeOfLabel_1(id arg0, SEL arg1, BOOL arg2) {
	NSSize* lprc = ((NSSize* (*)(id, SEL, BOOL))CALLBACK_1sizeOfLabel_1)(arg0, arg1, arg2);
	NSSize rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSSize));
	}
	return rc;
}
static jintLong CALLBACK_sizeOfLabel_(jintLong func) {
	CALLBACK_1sizeOfLabel_1 = func;
	return (jintLong)proc_CALLBACK_1sizeOfLabel_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1sizeOfLabel_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1sizeOfLabel_1_FUNC);
	rc = (jlong)CALLBACK_sizeOfLabel_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1sizeOfLabel_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1
static jintLong CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1;
static NSRange proc_CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1(id arg0, SEL arg1, NSTextView* arg2, NSRange arg3, NSRange arg4) {
	NSRange* lprc = ((NSRange* (*)(id, SEL, NSTextView*, NSRange*, NSRange*))CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1)(arg0, arg1, arg2, &arg3, &arg4);
	NSRange rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRange));
	}
	return rc;
}
static jintLong CALLBACK_textView_willChangeSelectionFromCharacterRange_toCharacterRange_(jintLong func) {
	CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1 = func;
	return (jintLong)proc_CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1_FUNC);
	rc = (jlong)CALLBACK_textView_willChangeSelectionFromCharacterRange_toCharacterRange_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1textView_1willChangeSelectionFromCharacterRange_1toCharacterRange_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1titleRectForBounds_1
static jintLong CALLBACK_1titleRectForBounds_1;
static NSRect proc_CALLBACK_1titleRectForBounds_1(id arg0, SEL arg1, NSRect arg2) {
	NSRect* lprc = ((NSRect* (*)(id, SEL, NSRect*))CALLBACK_1titleRectForBounds_1)(arg0, arg1, &arg2);
	NSRect rc;
	if (lprc) {
		rc = *lprc;
		free(lprc);
	} else {
		memset(&rc, 0, sizeof(NSRect));
	}
	return rc;
}
static jintLong CALLBACK_titleRectForBounds_(jintLong func) {
	CALLBACK_1titleRectForBounds_1 = func;
	return (jintLong)proc_CALLBACK_1titleRectForBounds_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1titleRectForBounds_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1titleRectForBounds_1_FUNC);
	rc = (jlong)CALLBACK_titleRectForBounds_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1titleRectForBounds_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1view_1stringForToolTip_1point_1userData_1
static jintLong CALLBACK_1view_1stringForToolTip_1point_1userData_1;
static NSString* proc_CALLBACK_1view_1stringForToolTip_1point_1userData_1(id arg0, SEL arg1, NSView* arg2, NSToolTipTag arg3, NSPoint arg4, void* arg5) {
	return ((NSString* (*)(id, SEL, NSView*, NSToolTipTag, NSPoint*, void*))CALLBACK_1view_1stringForToolTip_1point_1userData_1)(arg0, arg1, arg2, arg3, &arg4, arg5);
}
static jintLong CALLBACK_view_stringForToolTip_point_userData_(jintLong func) {
	CALLBACK_1view_1stringForToolTip_1point_1userData_1 = func;
	return (jintLong)proc_CALLBACK_1view_1stringForToolTip_1point_1userData_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1view_1stringForToolTip_1point_1userData_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1view_1stringForToolTip_1point_1userData_1_FUNC);
	rc = (jlong)CALLBACK_view_stringForToolTip_point_userData_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1view_1stringForToolTip_1point_1userData_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CALLBACK_1webView_1setFrame_1
static jintLong CALLBACK_1webView_1setFrame_1;
static void proc_CALLBACK_1webView_1setFrame_1(id arg0, SEL arg1, WebView* arg2, NSRect arg3) {
	((void (*)(id, SEL, WebView*, NSRect*))CALLBACK_1webView_1setFrame_1)(arg0, arg1, arg2, &arg3);
}
static jintLong CALLBACK_webView_setFrame_(jintLong func) {
	CALLBACK_1webView_1setFrame_1 = func;
	return (jintLong)proc_CALLBACK_1webView_1setFrame_1;
}
JNIEXPORT jlong JNICALL OS_NATIVE(CALLBACK_1webView_1setFrame_1)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CALLBACK_1webView_1setFrame_1_FUNC);
	rc = (jlong)CALLBACK_webView_setFrame_(arg0);
	OS_NATIVE_EXIT(env, that, CALLBACK_1webView_1setFrame_1_FUNC);
	return rc;
}
#endif

#ifndef NO_CFDataGetBytePtr
JNIEXPORT jlong JNICALL OS_NATIVE(CFDataGetBytePtr)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CFDataGetBytePtr_FUNC);
	rc = (jlong)CFDataGetBytePtr((CFDataRef)arg0);
	OS_NATIVE_EXIT(env, that, CFDataGetBytePtr_FUNC);
	return rc;
}
#endif

#ifndef NO_CFDataGetLength
JNIEXPORT jlong JNICALL OS_NATIVE(CFDataGetLength)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CFDataGetLength_FUNC);
	rc = (jlong)CFDataGetLength((CFDataRef)arg0);
	OS_NATIVE_EXIT(env, that, CFDataGetLength_FUNC);
	return rc;
}
#endif

#ifndef NO_CFRelease
JNIEXPORT void JNICALL OS_NATIVE(CFRelease)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CFRelease_FUNC);
	CFRelease((CFTypeRef)arg0);
	OS_NATIVE_EXIT(env, that, CFRelease_FUNC);
}
#endif

#ifndef NO_CFRunLoopAddObserver
JNIEXPORT void JNICALL OS_NATIVE(CFRunLoopAddObserver)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, CFRunLoopAddObserver_FUNC);
	CFRunLoopAddObserver((CFRunLoopRef)arg0, (CFRunLoopObserverRef)arg1, (CFStringRef)arg2);
	OS_NATIVE_EXIT(env, that, CFRunLoopAddObserver_FUNC);
}
#endif

#ifndef NO_CFRunLoopGetCurrent
JNIEXPORT jlong JNICALL OS_NATIVE(CFRunLoopGetCurrent)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CFRunLoopGetCurrent_FUNC);
	rc = (jlong)CFRunLoopGetCurrent();
	OS_NATIVE_EXIT(env, that, CFRunLoopGetCurrent_FUNC);
	return rc;
}
#endif

#ifndef NO_CFRunLoopObserverCreate
JNIEXPORT jlong JNICALL OS_NATIVE(CFRunLoopObserverCreate)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2, jlong arg3, jlong arg4, jlong arg5)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CFRunLoopObserverCreate_FUNC);
	rc = (jlong)CFRunLoopObserverCreate((CFAllocatorRef)arg0, (CFOptionFlags)arg1, (Boolean)arg2, (CFIndex)arg3, (CFRunLoopObserverCallBack)arg4, (CFRunLoopObserverContext*)arg5);
	OS_NATIVE_EXIT(env, that, CFRunLoopObserverCreate_FUNC);
	return rc;
}
#endif

#ifndef NO_CFRunLoopObserverInvalidate
JNIEXPORT void JNICALL OS_NATIVE(CFRunLoopObserverInvalidate)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CFRunLoopObserverInvalidate_FUNC);
	CFRunLoopObserverInvalidate((CFRunLoopObserverRef)arg0);
	OS_NATIVE_EXIT(env, that, CFRunLoopObserverInvalidate_FUNC);
}
#endif

#ifndef NO_CFURLCreateFromFSRef
JNIEXPORT jlong JNICALL OS_NATIVE(CFURLCreateFromFSRef)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CFURLCreateFromFSRef_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)CFURLCreateFromFSRef((CFAllocatorRef)arg0, (FSRef*)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, CFURLCreateFromFSRef_FUNC);
	return rc;
}
#endif

#ifndef NO_CFURLCreateStringByAddingPercentEscapes
JNIEXPORT jlong JNICALL OS_NATIVE(CFURLCreateStringByAddingPercentEscapes)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jint arg4)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CFURLCreateStringByAddingPercentEscapes_FUNC);
	rc = (jlong)CFURLCreateStringByAddingPercentEscapes((CFAllocatorRef)arg0, (CFStringRef)arg1, (CFStringRef)arg2, (CFStringRef)arg3, (CFStringEncoding)arg4);
	OS_NATIVE_EXIT(env, that, CFURLCreateStringByAddingPercentEscapes_FUNC);
	return rc;
}
#endif

#ifndef NO_CGAffineTransform_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(CGAffineTransform_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, CGAffineTransform_1sizeof_FUNC);
	rc = (jint)CGAffineTransform_sizeof();
	OS_NATIVE_EXIT(env, that, CGAffineTransform_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_CGBitmapContextCreate
JNIEXPORT jlong JNICALL OS_NATIVE(CGBitmapContextCreate)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jint arg6)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGBitmapContextCreate_FUNC);
	rc = (jlong)CGBitmapContextCreate((void*)arg0, (size_t)arg1, (size_t)arg2, (size_t)arg3, (size_t)arg4, (CGColorSpaceRef)arg5, (CGBitmapInfo)arg6);
	OS_NATIVE_EXIT(env, that, CGBitmapContextCreate_FUNC);
	return rc;
}
#endif

#ifndef NO_CGColorCreate
JNIEXPORT jlong JNICALL OS_NATIVE(CGColorCreate)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1)
{
	jdouble *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGColorCreate_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)CGColorCreate((CGColorSpaceRef)arg0, (CGFloat*)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, CGColorCreate_FUNC);
	return rc;
}
#endif

#ifndef NO_CGColorRelease
JNIEXPORT void JNICALL OS_NATIVE(CGColorRelease)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGColorRelease_FUNC);
	CGColorRelease((CGColorRef)arg0);
	OS_NATIVE_EXIT(env, that, CGColorRelease_FUNC);
}
#endif

#ifndef NO_CGColorSpaceCreateDeviceRGB
JNIEXPORT jlong JNICALL OS_NATIVE(CGColorSpaceCreateDeviceRGB)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGColorSpaceCreateDeviceRGB_FUNC);
	rc = (jlong)CGColorSpaceCreateDeviceRGB();
	OS_NATIVE_EXIT(env, that, CGColorSpaceCreateDeviceRGB_FUNC);
	return rc;
}
#endif

#ifndef NO_CGColorSpaceRelease
JNIEXPORT void JNICALL OS_NATIVE(CGColorSpaceRelease)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGColorSpaceRelease_FUNC);
	CGColorSpaceRelease((CGColorSpaceRef)arg0);
	OS_NATIVE_EXIT(env, that, CGColorSpaceRelease_FUNC);
}
#endif

#ifndef NO_CGContextAddPath
JNIEXPORT void JNICALL OS_NATIVE(CGContextAddPath)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, CGContextAddPath_FUNC);
	CGContextAddPath((CGContextRef)arg0, (CGPathRef)arg1);
	OS_NATIVE_EXIT(env, that, CGContextAddPath_FUNC);
}
#endif

#ifndef NO_CGContextBeginTransparencyLayerWithRect
JNIEXPORT void JNICALL OS_NATIVE(CGContextBeginTransparencyLayerWithRect)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	CGRect _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, CGContextBeginTransparencyLayerWithRect_FUNC);
	if (arg1) if ((lparg1 = getCGRectFields(env, arg1, &_arg1)) == NULL) goto fail;
	CGContextBeginTransparencyLayerWithRect((CGContextRef)arg0, *lparg1, (CFDictionaryRef)arg2);
fail:
	if (arg1 && lparg1) setCGRectFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, CGContextBeginTransparencyLayerWithRect_FUNC);
}
#endif

#ifndef NO_CGContextCopyPath
JNIEXPORT jlong JNICALL OS_NATIVE(CGContextCopyPath)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGContextCopyPath_FUNC);
	rc = (jlong)CGContextCopyPath((CGContextRef)arg0);
	OS_NATIVE_EXIT(env, that, CGContextCopyPath_FUNC);
	return rc;
}
#endif

#ifndef NO_CGContextDrawImage
JNIEXPORT void JNICALL OS_NATIVE(CGContextDrawImage)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	CGRect _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, CGContextDrawImage_FUNC);
	if (arg1) if ((lparg1 = getCGRectFields(env, arg1, &_arg1)) == NULL) goto fail;
	CGContextDrawImage((CGContextRef)arg0, *lparg1, (CGImageRef)arg2);
fail:
	if (arg1 && lparg1) setCGRectFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, CGContextDrawImage_FUNC);
}
#endif

#ifndef NO_CGContextEndTransparencyLayer
JNIEXPORT void JNICALL OS_NATIVE(CGContextEndTransparencyLayer)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGContextEndTransparencyLayer_FUNC);
	CGContextEndTransparencyLayer((CGContextRef)arg0);
	OS_NATIVE_EXIT(env, that, CGContextEndTransparencyLayer_FUNC);
}
#endif

#ifndef NO_CGContextFillRect
JNIEXPORT void JNICALL OS_NATIVE(CGContextFillRect)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	CGRect _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, CGContextFillRect_FUNC);
	if (arg1) if ((lparg1 = getCGRectFields(env, arg1, &_arg1)) == NULL) goto fail;
	CGContextFillRect((CGContextRef)arg0, *lparg1);
fail:
	if (arg1 && lparg1) setCGRectFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, CGContextFillRect_FUNC);
}
#endif

#ifndef NO_CGContextRelease
JNIEXPORT void JNICALL OS_NATIVE(CGContextRelease)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGContextRelease_FUNC);
	CGContextRelease((CGContextRef)arg0);
	OS_NATIVE_EXIT(env, that, CGContextRelease_FUNC);
}
#endif

#ifndef NO_CGContextReplacePathWithStrokedPath
JNIEXPORT void JNICALL OS_NATIVE(CGContextReplacePathWithStrokedPath)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGContextReplacePathWithStrokedPath_FUNC);
	CGContextReplacePathWithStrokedPath((CGContextRef)arg0);
	OS_NATIVE_EXIT(env, that, CGContextReplacePathWithStrokedPath_FUNC);
}
#endif

#ifndef NO_CGContextRestoreGState
JNIEXPORT void JNICALL OS_NATIVE(CGContextRestoreGState)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGContextRestoreGState_FUNC);
	CGContextRestoreGState((CGContextRef)arg0);
	OS_NATIVE_EXIT(env, that, CGContextRestoreGState_FUNC);
}
#endif

#ifndef NO_CGContextSaveGState
JNIEXPORT void JNICALL OS_NATIVE(CGContextSaveGState)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGContextSaveGState_FUNC);
	CGContextSaveGState((CGContextRef)arg0);
	OS_NATIVE_EXIT(env, that, CGContextSaveGState_FUNC);
}
#endif

#ifndef NO_CGContextScaleCTM
JNIEXPORT void JNICALL OS_NATIVE(CGContextScaleCTM)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jdouble arg2)
{
	OS_NATIVE_ENTER(env, that, CGContextScaleCTM_FUNC);
	CGContextScaleCTM((CGContextRef)arg0, (CGFloat)arg1, (CGFloat)arg2);
	OS_NATIVE_EXIT(env, that, CGContextScaleCTM_FUNC);
}
#endif

#ifndef NO_CGContextSetBlendMode
JNIEXPORT void JNICALL OS_NATIVE(CGContextSetBlendMode)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, CGContextSetBlendMode_FUNC);
	CGContextSetBlendMode((CGContextRef)arg0, (CGBlendMode)arg1);
	OS_NATIVE_EXIT(env, that, CGContextSetBlendMode_FUNC);
}
#endif

#ifndef NO_CGContextSetFillColor
JNIEXPORT void JNICALL OS_NATIVE(CGContextSetFillColor)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1)
{
	jdouble *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, CGContextSetFillColor_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	CGContextSetFillColor((CGContextRef)arg0, (CGFloat*)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, CGContextSetFillColor_FUNC);
}
#endif

#ifndef NO_CGContextSetFillColorSpace
JNIEXPORT void JNICALL OS_NATIVE(CGContextSetFillColorSpace)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, CGContextSetFillColorSpace_FUNC);
	CGContextSetFillColorSpace((CGContextRef)arg0, (CGColorSpaceRef)arg1);
	OS_NATIVE_EXIT(env, that, CGContextSetFillColorSpace_FUNC);
}
#endif

#ifndef NO_CGContextSetLineCap
JNIEXPORT void JNICALL OS_NATIVE(CGContextSetLineCap)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, CGContextSetLineCap_FUNC);
	CGContextSetLineCap((CGContextRef)arg0, (CGLineCap)arg1);
	OS_NATIVE_EXIT(env, that, CGContextSetLineCap_FUNC);
}
#endif

#ifndef NO_CGContextSetLineDash
JNIEXPORT void JNICALL OS_NATIVE(CGContextSetLineDash)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jdoubleArray arg2, jlong arg3)
{
	jdouble *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, CGContextSetLineDash_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	CGContextSetLineDash((CGContextRef)arg0, (CGFloat)arg1, (CGFloat*)lparg2, (size_t)arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, CGContextSetLineDash_FUNC);
}
#endif

#ifndef NO_CGContextSetLineJoin
JNIEXPORT void JNICALL OS_NATIVE(CGContextSetLineJoin)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, CGContextSetLineJoin_FUNC);
	CGContextSetLineJoin((CGContextRef)arg0, (CGLineJoin)arg1);
	OS_NATIVE_EXIT(env, that, CGContextSetLineJoin_FUNC);
}
#endif

#ifndef NO_CGContextSetLineWidth
JNIEXPORT void JNICALL OS_NATIVE(CGContextSetLineWidth)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	OS_NATIVE_ENTER(env, that, CGContextSetLineWidth_FUNC);
	CGContextSetLineWidth((CGContextRef)arg0, (CGFloat)arg1);
	OS_NATIVE_EXIT(env, that, CGContextSetLineWidth_FUNC);
}
#endif

#ifndef NO_CGContextSetMiterLimit
JNIEXPORT void JNICALL OS_NATIVE(CGContextSetMiterLimit)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	OS_NATIVE_ENTER(env, that, CGContextSetMiterLimit_FUNC);
	CGContextSetMiterLimit((CGContextRef)arg0, (CGFloat)arg1);
	OS_NATIVE_EXIT(env, that, CGContextSetMiterLimit_FUNC);
}
#endif

#ifndef NO_CGContextStrokePath
JNIEXPORT void JNICALL OS_NATIVE(CGContextStrokePath)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGContextStrokePath_FUNC);
	CGContextStrokePath((CGContextRef)arg0);
	OS_NATIVE_EXIT(env, that, CGContextStrokePath_FUNC);
}
#endif

#ifndef NO_CGContextTranslateCTM
JNIEXPORT void JNICALL OS_NATIVE(CGContextTranslateCTM)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jdouble arg2)
{
	OS_NATIVE_ENTER(env, that, CGContextTranslateCTM_FUNC);
	CGContextTranslateCTM((CGContextRef)arg0, (CGFloat)arg1, (CGFloat)arg2);
	OS_NATIVE_EXIT(env, that, CGContextTranslateCTM_FUNC);
}
#endif

#ifndef NO_CGDataProviderCreateWithData
JNIEXPORT jlong JNICALL OS_NATIVE(CGDataProviderCreateWithData)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGDataProviderCreateWithData_FUNC);
	rc = (jlong)CGDataProviderCreateWithData((void*)arg0, (void*)arg1, (size_t)arg2, (CGDataProviderReleaseDataCallback)arg3);
	OS_NATIVE_EXIT(env, that, CGDataProviderCreateWithData_FUNC);
	return rc;
}
#endif

#ifndef NO_CGDataProviderRelease
JNIEXPORT void JNICALL OS_NATIVE(CGDataProviderRelease)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGDataProviderRelease_FUNC);
	CGDataProviderRelease((CGDataProviderRef)arg0);
	OS_NATIVE_EXIT(env, that, CGDataProviderRelease_FUNC);
}
#endif

#ifndef NO_CGDisplayCreateImage
JNIEXPORT jlong JNICALL OS_NATIVE(CGDisplayCreateImage)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGDisplayCreateImage_FUNC);
	rc = (jlong)CGDisplayCreateImage((CGDirectDisplayID)arg0);
	OS_NATIVE_EXIT(env, that, CGDisplayCreateImage_FUNC);
	return rc;
}
#endif

#ifndef NO_CGEventCreateKeyboardEvent
JNIEXPORT jlong JNICALL OS_NATIVE(CGEventCreateKeyboardEvent)
	(JNIEnv *env, jclass that, jlong arg0, jshort arg1, jboolean arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGEventCreateKeyboardEvent_FUNC);
	rc = (jlong)CGEventCreateKeyboardEvent((CGEventSourceRef)arg0, (CGKeyCode)arg1, (_Bool)arg2);
	OS_NATIVE_EXIT(env, that, CGEventCreateKeyboardEvent_FUNC);
	return rc;
}
#endif

#ifndef NO_CGEventCreateMouseEvent
JNIEXPORT jlong JNICALL OS_NATIVE(CGEventCreateMouseEvent)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2, jint arg3)
{
	CGPoint _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGEventCreateMouseEvent_FUNC);
	if (arg2) if ((lparg2 = getCGPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)CGEventCreateMouseEvent((CGEventSourceRef)arg0, (CGEventType)arg1, *lparg2, (CGMouseButton)arg3);
fail:
	if (arg2 && lparg2) setCGPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, CGEventCreateMouseEvent_FUNC);
	return rc;
}
#endif

#ifndef NO_CGEventCreateScrollWheelEvent
JNIEXPORT jlong JNICALL OS_NATIVE(CGEventCreateScrollWheelEvent)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGEventCreateScrollWheelEvent_FUNC);
	rc = (jlong)CGEventCreateScrollWheelEvent((CGEventSourceRef)arg0, (CGScrollEventUnit)arg1, (uint32_t)arg2, (int32_t)arg3);
	OS_NATIVE_EXIT(env, that, CGEventCreateScrollWheelEvent_FUNC);
	return rc;
}
#endif

#ifndef NO_CGEventGetIntegerValueField
JNIEXPORT jlong JNICALL OS_NATIVE(CGEventGetIntegerValueField)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGEventGetIntegerValueField_FUNC);
	rc = (jlong)CGEventGetIntegerValueField((CGEventRef)arg0, (CGEventField)arg1);
	OS_NATIVE_EXIT(env, that, CGEventGetIntegerValueField_FUNC);
	return rc;
}
#endif

#ifndef NO_CGEventPost
JNIEXPORT void JNICALL OS_NATIVE(CGEventPost)
	(JNIEnv *env, jclass that, jint arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, CGEventPost_FUNC);
	CGEventPost((CGEventTapLocation)arg0, (CGEventRef)arg1);
	OS_NATIVE_EXIT(env, that, CGEventPost_FUNC);
}
#endif

#ifndef NO_CGEventSourceCreate
JNIEXPORT jlong JNICALL OS_NATIVE(CGEventSourceCreate)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGEventSourceCreate_FUNC);
	rc = (jlong)CGEventSourceCreate((CGEventSourceStateID)arg0);
	OS_NATIVE_EXIT(env, that, CGEventSourceCreate_FUNC);
	return rc;
}
#endif

#ifndef NO_CGGetDisplaysWithRect
JNIEXPORT jint JNICALL OS_NATIVE(CGGetDisplaysWithRect)
	(JNIEnv *env, jclass that, jobject arg0, jint arg1, jlong arg2, jlong arg3)
{
	CGRect _arg0, *lparg0=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, CGGetDisplaysWithRect_FUNC);
	if (arg0) if ((lparg0 = getCGRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jint)CGGetDisplaysWithRect(*lparg0, (uint32_t)arg1, (CGDirectDisplayID*)arg2, (uint32_t*)arg3);
fail:
	if (arg0 && lparg0) setCGRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, CGGetDisplaysWithRect_FUNC);
	return rc;
}
#endif

#ifndef NO_CGImageCreate
JNIEXPORT jlong JNICALL OS_NATIVE(CGImageCreate)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jint arg6, jlong arg7, jlong arg8, jboolean arg9, jint arg10)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGImageCreate_FUNC);
	rc = (jlong)CGImageCreate((size_t)arg0, (size_t)arg1, (size_t)arg2, (size_t)arg3, (size_t)arg4, (CGColorSpaceRef)arg5, (CGBitmapInfo)arg6, (CGDataProviderRef)arg7, (CGFloat*)arg8, (_Bool)arg9, (CGColorRenderingIntent)arg10);
	OS_NATIVE_EXIT(env, that, CGImageCreate_FUNC);
	return rc;
}
#endif

#ifndef NO_CGImageGetHeight
JNIEXPORT jlong JNICALL OS_NATIVE(CGImageGetHeight)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGImageGetHeight_FUNC);
	rc = (jlong)CGImageGetHeight((CGImageRef)arg0);
	OS_NATIVE_EXIT(env, that, CGImageGetHeight_FUNC);
	return rc;
}
#endif

#ifndef NO_CGImageGetWidth
JNIEXPORT jlong JNICALL OS_NATIVE(CGImageGetWidth)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGImageGetWidth_FUNC);
	rc = (jlong)CGImageGetWidth((CGImageRef)arg0);
	OS_NATIVE_EXIT(env, that, CGImageGetWidth_FUNC);
	return rc;
}
#endif

#ifndef NO_CGImageRelease
JNIEXPORT void JNICALL OS_NATIVE(CGImageRelease)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGImageRelease_FUNC);
	CGImageRelease((CGImageRef)arg0);
	OS_NATIVE_EXIT(env, that, CGImageRelease_FUNC);
}
#endif

#ifndef NO_CGPathAddCurveToPoint
JNIEXPORT void JNICALL OS_NATIVE(CGPathAddCurveToPoint)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3, jdouble arg4, jdouble arg5, jdouble arg6, jdouble arg7)
{
	OS_NATIVE_ENTER(env, that, CGPathAddCurveToPoint_FUNC);
	CGPathAddCurveToPoint((CGMutablePathRef)arg0, (CGAffineTransform*)arg1, (CGFloat)arg2, (CGFloat)arg3, (CGFloat)arg4, (CGFloat)arg5, (CGFloat)arg6, (CGFloat)arg7);
	OS_NATIVE_EXIT(env, that, CGPathAddCurveToPoint_FUNC);
}
#endif

#ifndef NO_CGPathAddLineToPoint
JNIEXPORT void JNICALL OS_NATIVE(CGPathAddLineToPoint)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3)
{
	OS_NATIVE_ENTER(env, that, CGPathAddLineToPoint_FUNC);
	CGPathAddLineToPoint((CGMutablePathRef)arg0, (CGAffineTransform*)arg1, (CGFloat)arg2, (CGFloat)arg3);
	OS_NATIVE_EXIT(env, that, CGPathAddLineToPoint_FUNC);
}
#endif

#ifndef NO_CGPathApply
JNIEXPORT void JNICALL OS_NATIVE(CGPathApply)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, CGPathApply_FUNC);
	CGPathApply((CGPathRef)arg0, (void*)arg1, (CGPathApplierFunction)arg2);
	OS_NATIVE_EXIT(env, that, CGPathApply_FUNC);
}
#endif

#ifndef NO_CGPathCloseSubpath
JNIEXPORT void JNICALL OS_NATIVE(CGPathCloseSubpath)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGPathCloseSubpath_FUNC);
	CGPathCloseSubpath((CGMutablePathRef)arg0);
	OS_NATIVE_EXIT(env, that, CGPathCloseSubpath_FUNC);
}
#endif

#ifndef NO_CGPathCreateMutable
JNIEXPORT jlong JNICALL OS_NATIVE(CGPathCreateMutable)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, CGPathCreateMutable_FUNC);
	rc = (jlong)CGPathCreateMutable();
	OS_NATIVE_EXIT(env, that, CGPathCreateMutable_FUNC);
	return rc;
}
#endif

#ifndef NO_CGPathElement_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(CGPathElement_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, CGPathElement_1sizeof_FUNC);
	rc = (jint)CGPathElement_sizeof();
	OS_NATIVE_EXIT(env, that, CGPathElement_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_CGPathMoveToPoint
JNIEXPORT void JNICALL OS_NATIVE(CGPathMoveToPoint)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3)
{
	OS_NATIVE_ENTER(env, that, CGPathMoveToPoint_FUNC);
	CGPathMoveToPoint((CGMutablePathRef)arg0, (CGAffineTransform*)arg1, (CGFloat)arg2, (CGFloat)arg3);
	OS_NATIVE_EXIT(env, that, CGPathMoveToPoint_FUNC);
}
#endif

#ifndef NO_CGPathRelease
JNIEXPORT void JNICALL OS_NATIVE(CGPathRelease)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CGPathRelease_FUNC);
	CGPathRelease((CGPathRef)arg0);
	OS_NATIVE_EXIT(env, that, CGPathRelease_FUNC);
}
#endif

#ifndef NO_CGPoint_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(CGPoint_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, CGPoint_1sizeof_FUNC);
	rc = (jint)CGPoint_sizeof();
	OS_NATIVE_EXIT(env, that, CGPoint_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_CGRect_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(CGRect_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, CGRect_1sizeof_FUNC);
	rc = (jint)CGRect_sizeof();
	OS_NATIVE_EXIT(env, that, CGRect_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_CGSize_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(CGSize_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, CGSize_1sizeof_FUNC);
	rc = (jint)CGSize_sizeof();
	OS_NATIVE_EXIT(env, that, CGSize_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_CPSSetProcessName
JNIEXPORT jint JNICALL OS_NATIVE(CPSSetProcessName)
	(JNIEnv *env, jclass that, jintArray arg0, jlong arg1)
{
	jint *lparg0=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, CPSSetProcessName_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetIntArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jint)CPSSetProcessName(lparg0, arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseIntArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, CPSSetProcessName_FUNC);
	return rc;
}
#endif

#ifndef NO_CTFontManagerRegisterFontsForURL
JNIEXPORT jboolean JNICALL OS_NATIVE(CTFontManagerRegisterFontsForURL)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, CTFontManagerRegisterFontsForURL_FUNC);
	rc = (jboolean)CTFontManagerRegisterFontsForURL((CFURLRef)arg0, (CTFontManagerScope)arg1, (CFErrorRef*)arg2);
	OS_NATIVE_EXIT(env, that, CTFontManagerRegisterFontsForURL_FUNC);
	return rc;
}
#endif

#ifndef NO_CancelMenuTracking
JNIEXPORT jint JNICALL OS_NATIVE(CancelMenuTracking)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1, jint arg2)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, CancelMenuTracking_FUNC);
/*
	rc = (jint)CancelMenuTracking(arg0, arg1, arg2);
*/
	{
		OS_LOAD_FUNCTION(fp, CancelMenuTracking)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(jlong, jboolean, jint))fp)(arg0, arg1, arg2);
		}
	}
	OS_NATIVE_EXIT(env, that, CancelMenuTracking_FUNC);
	return rc;
}
#endif

#ifndef NO_CloseRgn
JNIEXPORT void JNICALL OS_NATIVE(CloseRgn)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, CloseRgn_FUNC);
/*
	CloseRgn(arg0);
*/
	{
		OS_LOAD_FUNCTION(fp, CloseRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	OS_NATIVE_EXIT(env, that, CloseRgn_FUNC);
}
#endif

#ifndef NO_CopyRgn
JNIEXPORT void JNICALL OS_NATIVE(CopyRgn)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, CopyRgn_FUNC);
/*
	CopyRgn(arg0, arg1);
*/
	{
		OS_LOAD_FUNCTION(fp, CopyRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong))fp)(arg0, arg1);
		}
	}
	OS_NATIVE_EXIT(env, that, CopyRgn_FUNC);
}
#endif

#ifndef NO_DeleteGlobalRef
JNIEXPORT void JNICALL OS_NATIVE(DeleteGlobalRef)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, DeleteGlobalRef_FUNC);
	(*env)->DeleteGlobalRef(env, (jobject)arg0);
	OS_NATIVE_EXIT(env, that, DeleteGlobalRef_FUNC);
}
#endif

#ifndef NO_DiffRgn
JNIEXPORT void JNICALL OS_NATIVE(DiffRgn)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, DiffRgn_FUNC);
/*
	DiffRgn(arg0, arg1, arg2);
*/
	{
		OS_LOAD_FUNCTION(fp, DiffRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong, jlong))fp)(arg0, arg1, arg2);
		}
	}
	OS_NATIVE_EXIT(env, that, DiffRgn_FUNC);
}
#endif

#ifndef NO_DisposeRgn
JNIEXPORT void JNICALL OS_NATIVE(DisposeRgn)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, DisposeRgn_FUNC);
/*
	DisposeRgn(arg0);
*/
	{
		OS_LOAD_FUNCTION(fp, DisposeRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	OS_NATIVE_EXIT(env, that, DisposeRgn_FUNC);
}
#endif

#ifndef NO_EmptyRgn
JNIEXPORT jboolean JNICALL OS_NATIVE(EmptyRgn)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, EmptyRgn_FUNC);
/*
	rc = (jboolean)EmptyRgn(arg0);
*/
	{
		OS_LOAD_FUNCTION(fp, EmptyRgn)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	OS_NATIVE_EXIT(env, that, EmptyRgn_FUNC);
	return rc;
}
#endif

#ifndef NO_GetCurrentProcess
JNIEXPORT jint JNICALL OS_NATIVE(GetCurrentProcess)
	(JNIEnv *env, jclass that, jintArray arg0)
{
	jint *lparg0=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, GetCurrentProcess_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetIntArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jint)GetCurrentProcess((ProcessSerialNumber *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseIntArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, GetCurrentProcess_FUNC);
	return rc;
}
#endif

#ifndef NO_GetIconRefFromTypeInfo
JNIEXPORT jint JNICALL OS_NATIVE(GetIconRefFromTypeInfo)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jlong arg2, jlong arg3, jint arg4, jlongArray arg5)
{
	jlong *lparg5=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, GetIconRefFromTypeInfo_FUNC);
	if (arg5) if ((lparg5 = (*env)->GetLongArrayElements(env, arg5, NULL)) == NULL) goto fail;
/*
	rc = (jint)GetIconRefFromTypeInfo((OSType)arg0, (OSType)arg1, (CFStringRef)arg2, (CFStringRef)arg3, (IconServicesUsageFlags)arg4, (IconRef *)lparg5);
*/
	{
		OS_LOAD_FUNCTION(fp, GetIconRefFromTypeInfo)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(OSType, OSType, CFStringRef, CFStringRef, IconServicesUsageFlags, IconRef *))fp)((OSType)arg0, (OSType)arg1, (CFStringRef)arg2, (CFStringRef)arg3, (IconServicesUsageFlags)arg4, (IconRef *)lparg5);
		}
	}
fail:
	if (arg5 && lparg5) (*env)->ReleaseLongArrayElements(env, arg5, lparg5, 0);
	OS_NATIVE_EXIT(env, that, GetIconRefFromTypeInfo_FUNC);
	return rc;
}
#endif

#ifndef NO_GetRegionBounds
JNIEXPORT void JNICALL OS_NATIVE(GetRegionBounds)
	(JNIEnv *env, jclass that, jlong arg0, jshortArray arg1)
{
	jshort *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, GetRegionBounds_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetShortArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	GetRegionBounds(arg0, lparg1);
*/
	{
		OS_LOAD_FUNCTION(fp, GetRegionBounds)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jshort *))fp)(arg0, lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseShortArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, GetRegionBounds_FUNC);
}
#endif

#ifndef NO_GetSystemUIMode
JNIEXPORT jint JNICALL OS_NATIVE(GetSystemUIMode)
	(JNIEnv *env, jclass that, jintArray arg0, jintArray arg1)
{
	jint *lparg0=NULL;
	jint *lparg1=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, GetSystemUIMode_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetIntArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	rc = (jint)GetSystemUIMode((UInt32*)lparg0, (UInt32*)lparg1);
*/
	{
		OS_LOAD_FUNCTION(fp, GetSystemUIMode)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(UInt32*, UInt32*))fp)((UInt32*)lparg0, (UInt32*)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseIntArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, GetSystemUIMode_FUNC);
	return rc;
}
#endif

#ifndef NO_GetThemeMetric
JNIEXPORT void JNICALL OS_NATIVE(GetThemeMetric)
	(JNIEnv *env, jclass that, jint arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, GetThemeMetric_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	GetThemeMetric(arg0, (SInt32 *)lparg1);
*/
	{
		OS_LOAD_FUNCTION(fp, GetThemeMetric)
		if (fp) {
			((void (CALLING_CONVENTION*)(jint, SInt32 *))fp)(arg0, (SInt32 *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, GetThemeMetric_FUNC);
}
#endif

#ifndef NO_HIThemeDrawFocusRect
JNIEXPORT jint JNICALL OS_NATIVE(HIThemeDrawFocusRect)
	(JNIEnv *env, jclass that, jobject arg0, jboolean arg1, jlong arg2, jint arg3)
{
	CGRect _arg0, *lparg0=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, HIThemeDrawFocusRect_FUNC);
	if (arg0) if ((lparg0 = getCGRectFields(env, arg0, &_arg0)) == NULL) goto fail;
/*
	rc = (jint)HIThemeDrawFocusRect(lparg0, arg1, (CGContextRef)arg2, arg3);
*/
	{
		OS_LOAD_FUNCTION(fp, HIThemeDrawFocusRect)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(CGRect *, jboolean, CGContextRef, jint))fp)(lparg0, arg1, (CGContextRef)arg2, arg3);
		}
	}
fail:
	if (arg0 && lparg0) setCGRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, HIThemeDrawFocusRect_FUNC);
	return rc;
}
#endif

#ifndef NO_JSEvaluateScript
JNIEXPORT jlong JNICALL OS_NATIVE(JSEvaluateScript)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jint arg4, jlongArray arg5)
{
	jlong *lparg5=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, JSEvaluateScript_FUNC);
	if (arg5) if ((lparg5 = (*env)->GetLongArrayElements(env, arg5, NULL)) == NULL) goto fail;
	rc = (jlong)JSEvaluateScript((JSContextRef)arg0, (JSStringRef)arg1, (JSObjectRef)arg2, (JSStringRef)arg3, arg4, (JSValueRef *)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseLongArrayElements(env, arg5, lparg5, 0);
	OS_NATIVE_EXIT(env, that, JSEvaluateScript_FUNC);
	return rc;
}
#endif

#ifndef NO_JSStringCreateWithUTF8CString
JNIEXPORT jlong JNICALL OS_NATIVE(JSStringCreateWithUTF8CString)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, JSStringCreateWithUTF8CString_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)JSStringCreateWithUTF8CString((const char *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, JSStringCreateWithUTF8CString_FUNC);
	return rc;
}
#endif

#ifndef NO_JSStringRelease
JNIEXPORT void JNICALL OS_NATIVE(JSStringRelease)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, JSStringRelease_FUNC);
	JSStringRelease((JSStringRef)arg0);
	OS_NATIVE_EXIT(env, that, JSStringRelease_FUNC);
}
#endif

#ifndef NO_LMGetKbdType
JNIEXPORT jbyte JNICALL OS_NATIVE(LMGetKbdType)
	(JNIEnv *env, jclass that)
{
	jbyte rc = 0;
	OS_NATIVE_ENTER(env, that, LMGetKbdType_FUNC);
/*
	rc = (jbyte)LMGetKbdType();
*/
	{
		OS_LOAD_FUNCTION(fp, LMGetKbdType)
		if (fp) {
			rc = (jbyte)((jbyte (CALLING_CONVENTION*)())fp)();
		}
	}
	OS_NATIVE_EXIT(env, that, LMGetKbdType_FUNC);
	return rc;
}
#endif

#ifndef NO_LSGetApplicationForInfo
JNIEXPORT jlong JNICALL OS_NATIVE(LSGetApplicationForInfo)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jlong arg2, jint arg3, jbyteArray arg4, jintArray arg5)
{
	jbyte *lparg4=NULL;
	jint *lparg5=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, LSGetApplicationForInfo_FUNC);
	if (arg4) if ((lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
	rc = (jlong)LSGetApplicationForInfo((OSType)arg0, (OSType)arg1, (CFStringRef)arg2, (LSRolesMask)arg3, (FSRef *)lparg4, (CFURLRef *)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseByteArrayElements(env, arg4, lparg4, 0);
	OS_NATIVE_EXIT(env, that, LSGetApplicationForInfo_FUNC);
	return rc;
}
#endif

#ifndef NO_LineTo
JNIEXPORT void JNICALL OS_NATIVE(LineTo)
	(JNIEnv *env, jclass that, jshort arg0, jshort arg1)
{
	OS_NATIVE_ENTER(env, that, LineTo_FUNC);
/*
	LineTo(arg0, arg1);
*/
	{
		OS_LOAD_FUNCTION(fp, LineTo)
		if (fp) {
			((void (CALLING_CONVENTION*)(jshort, jshort))fp)(arg0, arg1);
		}
	}
	OS_NATIVE_EXIT(env, that, LineTo_FUNC);
}
#endif

#ifndef NO_MoveTo
JNIEXPORT void JNICALL OS_NATIVE(MoveTo)
	(JNIEnv *env, jclass that, jshort arg0, jshort arg1)
{
	OS_NATIVE_ENTER(env, that, MoveTo_FUNC);
/*
	MoveTo(arg0, arg1);
*/
	{
		OS_LOAD_FUNCTION(fp, MoveTo)
		if (fp) {
			((void (CALLING_CONVENTION*)(jshort, jshort))fp)(arg0, arg1);
		}
	}
	OS_NATIVE_EXIT(env, that, MoveTo_FUNC);
}
#endif

#ifndef NO_NSAccessibilityAttributedStringForRangeParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityAttributedStringForRangeParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityAttributedStringForRangeParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityAttributedStringForRangeParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityAttributedStringForRangeParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityBackgroundColorTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityBackgroundColorTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityBackgroundColorTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityBackgroundColorTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityBackgroundColorTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityBoundsForRangeParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityBoundsForRangeParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityBoundsForRangeParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityBoundsForRangeParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityBoundsForRangeParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityButtonRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityButtonRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityButtonRole_FUNC);
	rc = (jlong)NSAccessibilityButtonRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityButtonRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityCellForColumnAndRowParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityCellForColumnAndRowParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityCellForColumnAndRowParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityCellForColumnAndRowParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityCellForColumnAndRowParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityCheckBoxRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityCheckBoxRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityCheckBoxRole_FUNC);
	rc = (jlong)NSAccessibilityCheckBoxRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityCheckBoxRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityChildrenAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityChildrenAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityChildrenAttribute_FUNC);
	rc = (jlong)NSAccessibilityChildrenAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityChildrenAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityColumnIndexRangeAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityColumnIndexRangeAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityColumnIndexRangeAttribute_FUNC);
	rc = (jlong)NSAccessibilityColumnIndexRangeAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityColumnIndexRangeAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityColumnRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityColumnRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityColumnRole_FUNC);
	rc = (jlong)NSAccessibilityColumnRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityColumnRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityColumnsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityColumnsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityColumnsAttribute_FUNC);
	rc = (jlong)NSAccessibilityColumnsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityColumnsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityComboBoxRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityComboBoxRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityComboBoxRole_FUNC);
	rc = (jlong)NSAccessibilityComboBoxRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityComboBoxRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityConfirmAction
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityConfirmAction)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityConfirmAction_FUNC);
	rc = (jlong)NSAccessibilityConfirmAction;
	OS_NATIVE_EXIT(env, that, NSAccessibilityConfirmAction_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityContentsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityContentsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityContentsAttribute_FUNC);
	rc = (jlong)NSAccessibilityContentsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityContentsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityDescriptionAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityDescriptionAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityDescriptionAttribute_FUNC);
	rc = (jlong)NSAccessibilityDescriptionAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityDescriptionAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityDialogSubrole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityDialogSubrole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityDialogSubrole_FUNC);
	rc = (jlong)NSAccessibilityDialogSubrole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityDialogSubrole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityEnabledAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityEnabledAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityEnabledAttribute_FUNC);
	rc = (jlong)NSAccessibilityEnabledAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityEnabledAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityExpandedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityExpandedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityExpandedAttribute_FUNC);
	rc = (jlong)NSAccessibilityExpandedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityExpandedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityFocusedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityFocusedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityFocusedAttribute_FUNC);
	rc = (jlong)NSAccessibilityFocusedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityFocusedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityFocusedUIElementChangedNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityFocusedUIElementChangedNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityFocusedUIElementChangedNotification_FUNC);
	rc = (jlong)NSAccessibilityFocusedUIElementChangedNotification;
	OS_NATIVE_EXIT(env, that, NSAccessibilityFocusedUIElementChangedNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityFontFamilyKey
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityFontFamilyKey)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityFontFamilyKey_FUNC);
	rc = (jlong)NSAccessibilityFontFamilyKey;
	OS_NATIVE_EXIT(env, that, NSAccessibilityFontFamilyKey_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityFontNameKey
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityFontNameKey)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityFontNameKey_FUNC);
	rc = (jlong)NSAccessibilityFontNameKey;
	OS_NATIVE_EXIT(env, that, NSAccessibilityFontNameKey_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityFontSizeKey
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityFontSizeKey)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityFontSizeKey_FUNC);
	rc = (jlong)NSAccessibilityFontSizeKey;
	OS_NATIVE_EXIT(env, that, NSAccessibilityFontSizeKey_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityFontTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityFontTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityFontTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityFontTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityFontTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityForegroundColorTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityForegroundColorTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityForegroundColorTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityForegroundColorTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityForegroundColorTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityGroupRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityGroupRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityGroupRole_FUNC);
	rc = (jlong)NSAccessibilityGroupRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityGroupRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityHeaderAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityHeaderAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityHeaderAttribute_FUNC);
	rc = (jlong)NSAccessibilityHeaderAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityHeaderAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityHelpAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityHelpAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityHelpAttribute_FUNC);
	rc = (jlong)NSAccessibilityHelpAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityHelpAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityHelpTagRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityHelpTagRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityHelpTagRole_FUNC);
	rc = (jlong)NSAccessibilityHelpTagRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityHelpTagRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityHorizontalOrientationValue
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityHorizontalOrientationValue)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityHorizontalOrientationValue_FUNC);
	rc = (jlong)NSAccessibilityHorizontalOrientationValue;
	OS_NATIVE_EXIT(env, that, NSAccessibilityHorizontalOrientationValue_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityImageRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityImageRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityImageRole_FUNC);
	rc = (jlong)NSAccessibilityImageRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityImageRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityIndexAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityIndexAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityIndexAttribute_FUNC);
	rc = (jlong)NSAccessibilityIndexAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityIndexAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityInsertionPointLineNumberAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityInsertionPointLineNumberAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityInsertionPointLineNumberAttribute_FUNC);
	rc = (jlong)NSAccessibilityInsertionPointLineNumberAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityInsertionPointLineNumberAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityLineForIndexParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityLineForIndexParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityLineForIndexParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityLineForIndexParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityLineForIndexParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityLinkRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityLinkRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityLinkRole_FUNC);
	rc = (jlong)NSAccessibilityLinkRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityLinkRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityLinkTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityLinkTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityLinkTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityLinkTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityLinkTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityMaxValueAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityMaxValueAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityMaxValueAttribute_FUNC);
	rc = (jlong)NSAccessibilityMaxValueAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityMaxValueAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityMenuBarRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityMenuBarRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityMenuBarRole_FUNC);
	rc = (jlong)NSAccessibilityMenuBarRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityMenuBarRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityMenuButtonRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityMenuButtonRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityMenuButtonRole_FUNC);
	rc = (jlong)NSAccessibilityMenuButtonRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityMenuButtonRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityMenuItemRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityMenuItemRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityMenuItemRole_FUNC);
	rc = (jlong)NSAccessibilityMenuItemRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityMenuItemRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityMenuRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityMenuRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityMenuRole_FUNC);
	rc = (jlong)NSAccessibilityMenuRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityMenuRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityMinValueAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityMinValueAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityMinValueAttribute_FUNC);
	rc = (jlong)NSAccessibilityMinValueAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityMinValueAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityMisspelledTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityMisspelledTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityMisspelledTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityMisspelledTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityMisspelledTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityMovedNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityMovedNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityMovedNotification_FUNC);
	rc = (jlong)NSAccessibilityMovedNotification;
	OS_NATIVE_EXIT(env, that, NSAccessibilityMovedNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityNextContentsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityNextContentsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityNextContentsAttribute_FUNC);
	rc = (jlong)NSAccessibilityNextContentsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityNextContentsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityNumberOfCharactersAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityNumberOfCharactersAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityNumberOfCharactersAttribute_FUNC);
	rc = (jlong)NSAccessibilityNumberOfCharactersAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityNumberOfCharactersAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityOrientationAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityOrientationAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityOrientationAttribute_FUNC);
	rc = (jlong)NSAccessibilityOrientationAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityOrientationAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityOutlineRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityOutlineRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityOutlineRole_FUNC);
	rc = (jlong)NSAccessibilityOutlineRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityOutlineRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityOutlineRowSubrole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityOutlineRowSubrole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityOutlineRowSubrole_FUNC);
	rc = (jlong)NSAccessibilityOutlineRowSubrole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityOutlineRowSubrole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityParentAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityParentAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityParentAttribute_FUNC);
	rc = (jlong)NSAccessibilityParentAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityParentAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityPositionAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityPositionAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityPositionAttribute_FUNC);
	rc = (jlong)NSAccessibilityPositionAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityPositionAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityPostNotification
JNIEXPORT void JNICALL OS_NATIVE(NSAccessibilityPostNotification)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, NSAccessibilityPostNotification_FUNC);
	NSAccessibilityPostNotification((id)arg0, (NSString*)arg1);
	OS_NATIVE_EXIT(env, that, NSAccessibilityPostNotification_FUNC);
}
#endif

#ifndef NO_NSAccessibilityPressAction
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityPressAction)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityPressAction_FUNC);
	rc = (jlong)NSAccessibilityPressAction;
	OS_NATIVE_EXIT(env, that, NSAccessibilityPressAction_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityPreviousContentsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityPreviousContentsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityPreviousContentsAttribute_FUNC);
	rc = (jlong)NSAccessibilityPreviousContentsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityPreviousContentsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityProgressIndicatorRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityProgressIndicatorRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityProgressIndicatorRole_FUNC);
	rc = (jlong)NSAccessibilityProgressIndicatorRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityProgressIndicatorRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRadioButtonRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRadioButtonRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRadioButtonRole_FUNC);
	rc = (jlong)NSAccessibilityRadioButtonRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRadioButtonRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRangeForIndexParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRangeForIndexParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRangeForIndexParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityRangeForIndexParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRangeForIndexParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRangeForLineParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRangeForLineParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRangeForLineParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityRangeForLineParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRangeForLineParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRangeForPositionParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRangeForPositionParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRangeForPositionParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityRangeForPositionParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRangeForPositionParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRoleAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRoleAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRoleAttribute_FUNC);
	rc = (jlong)NSAccessibilityRoleAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRoleAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRoleDescription
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRoleDescription)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRoleDescription_FUNC);
	rc = (jlong)NSAccessibilityRoleDescription((NSString*)arg0, (NSString*)arg1);
	OS_NATIVE_EXIT(env, that, NSAccessibilityRoleDescription_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRoleDescriptionAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRoleDescriptionAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRoleDescriptionAttribute_FUNC);
	rc = (jlong)NSAccessibilityRoleDescriptionAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRoleDescriptionAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRowCountChangedNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRowCountChangedNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRowCountChangedNotification_FUNC);
	rc = (jlong)NSAccessibilityRowCountChangedNotification;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRowCountChangedNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRowIndexRangeAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRowIndexRangeAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRowIndexRangeAttribute_FUNC);
	rc = (jlong)NSAccessibilityRowIndexRangeAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRowIndexRangeAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRowRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRowRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRowRole_FUNC);
	rc = (jlong)NSAccessibilityRowRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRowRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityRowsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityRowsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityRowsAttribute_FUNC);
	rc = (jlong)NSAccessibilityRowsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityRowsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityScrollBarRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityScrollBarRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityScrollBarRole_FUNC);
	rc = (jlong)NSAccessibilityScrollBarRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityScrollBarRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedAttribute_FUNC);
	rc = (jlong)NSAccessibilitySelectedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedChildrenAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedChildrenAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedChildrenAttribute_FUNC);
	rc = (jlong)NSAccessibilitySelectedChildrenAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedChildrenAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedChildrenChangedNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedChildrenChangedNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedChildrenChangedNotification_FUNC);
	rc = (jlong)NSAccessibilitySelectedChildrenChangedNotification;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedChildrenChangedNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedColumnsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedColumnsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedColumnsAttribute_FUNC);
	rc = (jlong)NSAccessibilitySelectedColumnsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedColumnsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedRowsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedRowsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedRowsAttribute_FUNC);
	rc = (jlong)NSAccessibilitySelectedRowsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedRowsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedRowsChangedNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedRowsChangedNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedRowsChangedNotification_FUNC);
	rc = (jlong)NSAccessibilitySelectedRowsChangedNotification;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedRowsChangedNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedTextAttribute_FUNC);
	rc = (jlong)NSAccessibilitySelectedTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedTextChangedNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedTextChangedNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedTextChangedNotification_FUNC);
	rc = (jlong)NSAccessibilitySelectedTextChangedNotification;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedTextChangedNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedTextRangeAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedTextRangeAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedTextRangeAttribute_FUNC);
	rc = (jlong)NSAccessibilitySelectedTextRangeAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedTextRangeAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySelectedTextRangesAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySelectedTextRangesAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySelectedTextRangesAttribute_FUNC);
	rc = (jlong)NSAccessibilitySelectedTextRangesAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySelectedTextRangesAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityServesAsTitleForUIElementsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityServesAsTitleForUIElementsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityServesAsTitleForUIElementsAttribute_FUNC);
	rc = (jlong)NSAccessibilityServesAsTitleForUIElementsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityServesAsTitleForUIElementsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityShowMenuAction
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityShowMenuAction)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityShowMenuAction_FUNC);
	rc = (jlong)NSAccessibilityShowMenuAction;
	OS_NATIVE_EXIT(env, that, NSAccessibilityShowMenuAction_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySizeAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySizeAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySizeAttribute_FUNC);
	rc = (jlong)NSAccessibilitySizeAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySizeAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySliderRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySliderRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySliderRole_FUNC);
	rc = (jlong)NSAccessibilitySliderRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySliderRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySplitterRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySplitterRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySplitterRole_FUNC);
	rc = (jlong)NSAccessibilitySplitterRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySplitterRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityStaticTextRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityStaticTextRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityStaticTextRole_FUNC);
	rc = (jlong)NSAccessibilityStaticTextRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityStaticTextRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityStrikethroughColorTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityStrikethroughColorTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityStrikethroughColorTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityStrikethroughColorTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityStrikethroughColorTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityStrikethroughTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityStrikethroughTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityStrikethroughTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityStrikethroughTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityStrikethroughTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityStringForRangeParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityStringForRangeParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityStringForRangeParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityStringForRangeParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityStringForRangeParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityStyleRangeForIndexParameterizedAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityStyleRangeForIndexParameterizedAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityStyleRangeForIndexParameterizedAttribute_FUNC);
	rc = (jlong)NSAccessibilityStyleRangeForIndexParameterizedAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityStyleRangeForIndexParameterizedAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilitySubroleAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilitySubroleAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilitySubroleAttribute_FUNC);
	rc = (jlong)NSAccessibilitySubroleAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilitySubroleAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTabGroupRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTabGroupRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTabGroupRole_FUNC);
	rc = (jlong)NSAccessibilityTabGroupRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTabGroupRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTableRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTableRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTableRole_FUNC);
	rc = (jlong)NSAccessibilityTableRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTableRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTableRowSubrole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTableRowSubrole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTableRowSubrole_FUNC);
	rc = (jlong)NSAccessibilityTableRowSubrole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTableRowSubrole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTabsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTabsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTabsAttribute_FUNC);
	rc = (jlong)NSAccessibilityTabsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTabsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTextAreaRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTextAreaRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTextAreaRole_FUNC);
	rc = (jlong)NSAccessibilityTextAreaRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTextAreaRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTextFieldRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTextFieldRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTextFieldRole_FUNC);
	rc = (jlong)NSAccessibilityTextFieldRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTextFieldRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTitleAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTitleAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTitleAttribute_FUNC);
	rc = (jlong)NSAccessibilityTitleAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTitleAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTitleChangedNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTitleChangedNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTitleChangedNotification_FUNC);
	rc = (jlong)NSAccessibilityTitleChangedNotification;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTitleChangedNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTitleUIElementAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTitleUIElementAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTitleUIElementAttribute_FUNC);
	rc = (jlong)NSAccessibilityTitleUIElementAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTitleUIElementAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityToolbarRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityToolbarRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityToolbarRole_FUNC);
	rc = (jlong)NSAccessibilityToolbarRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityToolbarRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityTopLevelUIElementAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityTopLevelUIElementAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityTopLevelUIElementAttribute_FUNC);
	rc = (jlong)NSAccessibilityTopLevelUIElementAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityTopLevelUIElementAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityUnderlineColorTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityUnderlineColorTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityUnderlineColorTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityUnderlineColorTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityUnderlineColorTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityUnderlineTextAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityUnderlineTextAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityUnderlineTextAttribute_FUNC);
	rc = (jlong)NSAccessibilityUnderlineTextAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityUnderlineTextAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityUnignoredAncestor
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityUnignoredAncestor)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityUnignoredAncestor_FUNC);
	rc = (jlong)NSAccessibilityUnignoredAncestor((id)arg0);
	OS_NATIVE_EXIT(env, that, NSAccessibilityUnignoredAncestor_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityUnignoredChildren
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityUnignoredChildren)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityUnignoredChildren_FUNC);
	rc = (jlong)NSAccessibilityUnignoredChildren((NSArray*)arg0);
	OS_NATIVE_EXIT(env, that, NSAccessibilityUnignoredChildren_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityUnknownRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityUnknownRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityUnknownRole_FUNC);
	rc = (jlong)NSAccessibilityUnknownRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityUnknownRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityUnknownSubrole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityUnknownSubrole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityUnknownSubrole_FUNC);
	rc = (jlong)NSAccessibilityUnknownSubrole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityUnknownSubrole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityValueAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityValueAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityValueAttribute_FUNC);
	rc = (jlong)NSAccessibilityValueAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityValueAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityValueChangedNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityValueChangedNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityValueChangedNotification_FUNC);
	rc = (jlong)NSAccessibilityValueChangedNotification;
	OS_NATIVE_EXIT(env, that, NSAccessibilityValueChangedNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityVerticalOrientationValue
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityVerticalOrientationValue)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityVerticalOrientationValue_FUNC);
	rc = (jlong)NSAccessibilityVerticalOrientationValue;
	OS_NATIVE_EXIT(env, that, NSAccessibilityVerticalOrientationValue_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityVisibleCharacterRangeAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityVisibleCharacterRangeAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityVisibleCharacterRangeAttribute_FUNC);
	rc = (jlong)NSAccessibilityVisibleCharacterRangeAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityVisibleCharacterRangeAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityVisibleChildrenAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityVisibleChildrenAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityVisibleChildrenAttribute_FUNC);
	rc = (jlong)NSAccessibilityVisibleChildrenAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityVisibleChildrenAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityVisibleColumnsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityVisibleColumnsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityVisibleColumnsAttribute_FUNC);
	rc = (jlong)NSAccessibilityVisibleColumnsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityVisibleColumnsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityVisibleNameKey
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityVisibleNameKey)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityVisibleNameKey_FUNC);
	rc = (jlong)NSAccessibilityVisibleNameKey;
	OS_NATIVE_EXIT(env, that, NSAccessibilityVisibleNameKey_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityVisibleRowsAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityVisibleRowsAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityVisibleRowsAttribute_FUNC);
	rc = (jlong)NSAccessibilityVisibleRowsAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityVisibleRowsAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityWindowAttribute
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityWindowAttribute)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityWindowAttribute_FUNC);
	rc = (jlong)NSAccessibilityWindowAttribute;
	OS_NATIVE_EXIT(env, that, NSAccessibilityWindowAttribute_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAccessibilityWindowRole
JNIEXPORT jlong JNICALL OS_NATIVE(NSAccessibilityWindowRole)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAccessibilityWindowRole_FUNC);
	rc = (jlong)NSAccessibilityWindowRole;
	OS_NATIVE_EXIT(env, that, NSAccessibilityWindowRole_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAffineTransformStruct_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(NSAffineTransformStruct_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, NSAffineTransformStruct_1sizeof_FUNC);
	rc = (jint)NSAffineTransformStruct_sizeof();
	OS_NATIVE_EXIT(env, that, NSAffineTransformStruct_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_NSApplicationDidChangeScreenParametersNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSApplicationDidChangeScreenParametersNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSApplicationDidChangeScreenParametersNotification_FUNC);
	rc = (jlong)NSApplicationDidChangeScreenParametersNotification;
	OS_NATIVE_EXIT(env, that, NSApplicationDidChangeScreenParametersNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSAttachmentAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSAttachmentAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSAttachmentAttributeName_FUNC);
	rc = (jlong)NSAttachmentAttributeName;
	OS_NATIVE_EXIT(env, that, NSAttachmentAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSBackgroundColorAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSBackgroundColorAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSBackgroundColorAttributeName_FUNC);
	rc = (jlong)NSBackgroundColorAttributeName;
	OS_NATIVE_EXIT(env, that, NSBackgroundColorAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSBaselineOffsetAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSBaselineOffsetAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSBaselineOffsetAttributeName_FUNC);
	rc = (jlong)NSBaselineOffsetAttributeName;
	OS_NATIVE_EXIT(env, that, NSBaselineOffsetAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSBeep
JNIEXPORT void JNICALL OS_NATIVE(NSBeep)
	(JNIEnv *env, jclass that)
{
	OS_NATIVE_ENTER(env, that, NSBeep_FUNC);
	NSBeep();
	OS_NATIVE_EXIT(env, that, NSBeep_FUNC);
}
#endif

#ifndef NO_NSBitsPerPixelFromDepth
JNIEXPORT jlong JNICALL OS_NATIVE(NSBitsPerPixelFromDepth)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSBitsPerPixelFromDepth_FUNC);
	rc = (jlong)NSBitsPerPixelFromDepth((NSWindowDepth)arg0);
	OS_NATIVE_EXIT(env, that, NSBitsPerPixelFromDepth_FUNC);
	return rc;
}
#endif

#ifndef NO_NSCursorAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSCursorAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSCursorAttributeName_FUNC);
	rc = (jlong)NSCursorAttributeName;
	OS_NATIVE_EXIT(env, that, NSCursorAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSDefaultRunLoopMode
JNIEXPORT jlong JNICALL OS_NATIVE(NSDefaultRunLoopMode)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSDefaultRunLoopMode_FUNC);
	rc = (jlong)NSDefaultRunLoopMode;
	OS_NATIVE_EXIT(env, that, NSDefaultRunLoopMode_FUNC);
	return rc;
}
#endif

#ifndef NO_NSDeviceRGBColorSpace
JNIEXPORT jlong JNICALL OS_NATIVE(NSDeviceRGBColorSpace)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSDeviceRGBColorSpace_FUNC);
	rc = (jlong)NSDeviceRGBColorSpace;
	OS_NATIVE_EXIT(env, that, NSDeviceRGBColorSpace_FUNC);
	return rc;
}
#endif

#ifndef NO_NSDeviceResolution
JNIEXPORT jlong JNICALL OS_NATIVE(NSDeviceResolution)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSDeviceResolution_FUNC);
	rc = (jlong)NSDeviceResolution;
	OS_NATIVE_EXIT(env, that, NSDeviceResolution_FUNC);
	return rc;
}
#endif

#ifndef NO_NSDragPboard
JNIEXPORT jlong JNICALL OS_NATIVE(NSDragPboard)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSDragPboard_FUNC);
	rc = (jlong)NSDragPboard;
	OS_NATIVE_EXIT(env, that, NSDragPboard_FUNC);
	return rc;
}
#endif

#ifndef NO_NSEqualRects
JNIEXPORT jboolean JNICALL OS_NATIVE(NSEqualRects)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1)
{
	NSRect _arg0, *lparg0=NULL;
	NSRect _arg1, *lparg1=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, NSEqualRects_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getNSRectFields(env, arg1, &_arg1)) == NULL) goto fail;
	rc = (jboolean)NSEqualRects(*lparg0, *lparg1);
fail:
	if (arg1 && lparg1) setNSRectFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, NSEqualRects_FUNC);
	return rc;
}
#endif

#ifndef NO_NSEventTrackingRunLoopMode
JNIEXPORT jlong JNICALL OS_NATIVE(NSEventTrackingRunLoopMode)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSEventTrackingRunLoopMode_FUNC);
	rc = (jlong)NSEventTrackingRunLoopMode;
	OS_NATIVE_EXIT(env, that, NSEventTrackingRunLoopMode_FUNC);
	return rc;
}
#endif

#ifndef NO_NSFilenamesPboardType
JNIEXPORT jlong JNICALL OS_NATIVE(NSFilenamesPboardType)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSFilenamesPboardType_FUNC);
	rc = (jlong)NSFilenamesPboardType;
	OS_NATIVE_EXIT(env, that, NSFilenamesPboardType_FUNC);
	return rc;
}
#endif

#ifndef NO_NSFontAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSFontAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSFontAttributeName_FUNC);
	rc = (jlong)NSFontAttributeName;
	OS_NATIVE_EXIT(env, that, NSFontAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSForegroundColorAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSForegroundColorAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSForegroundColorAttributeName_FUNC);
	rc = (jlong)NSForegroundColorAttributeName;
	OS_NATIVE_EXIT(env, that, NSForegroundColorAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSImageNameCaution
JNIEXPORT jlong JNICALL OS_NATIVE(NSImageNameCaution)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSImageNameCaution_FUNC);
	rc = (jlong)NSImageNameCaution;
	OS_NATIVE_EXIT(env, that, NSImageNameCaution_FUNC);
	return rc;
}
#endif

#ifndef NO_NSImageNameInfo
JNIEXPORT jlong JNICALL OS_NATIVE(NSImageNameInfo)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSImageNameInfo_FUNC);
	rc = (jlong)NSImageNameInfo;
	OS_NATIVE_EXIT(env, that, NSImageNameInfo_FUNC);
	return rc;
}
#endif

#ifndef NO_NSLigatureAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSLigatureAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSLigatureAttributeName_FUNC);
	rc = (jlong)NSLigatureAttributeName;
	OS_NATIVE_EXIT(env, that, NSLigatureAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSLinkAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSLinkAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSLinkAttributeName_FUNC);
	rc = (jlong)NSLinkAttributeName;
	OS_NATIVE_EXIT(env, that, NSLinkAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSLocaleLanguageCode
JNIEXPORT jlong JNICALL OS_NATIVE(NSLocaleLanguageCode)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSLocaleLanguageCode_FUNC);
	rc = (jlong)NSLocaleLanguageCode;
	OS_NATIVE_EXIT(env, that, NSLocaleLanguageCode_FUNC);
	return rc;
}
#endif

#ifndef NO_NSModalPanelRunLoopMode
JNIEXPORT jlong JNICALL OS_NATIVE(NSModalPanelRunLoopMode)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSModalPanelRunLoopMode_FUNC);
	rc = (jlong)NSModalPanelRunLoopMode;
	OS_NATIVE_EXIT(env, that, NSModalPanelRunLoopMode_FUNC);
	return rc;
}
#endif

#ifndef NO_NSNotFound
JNIEXPORT jlong JNICALL OS_NATIVE(NSNotFound)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSNotFound_FUNC);
	rc = (jlong)NSNotFound;
	OS_NATIVE_EXIT(env, that, NSNotFound_FUNC);
	return rc;
}
#endif

#ifndef NO_NSObliquenessAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSObliquenessAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSObliquenessAttributeName_FUNC);
	rc = (jlong)NSObliquenessAttributeName;
	OS_NATIVE_EXIT(env, that, NSObliquenessAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSOperatingSystemVersion_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(NSOperatingSystemVersion_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, NSOperatingSystemVersion_1sizeof_FUNC);
	rc = (jint)NSOperatingSystemVersion_sizeof();
	OS_NATIVE_EXIT(env, that, NSOperatingSystemVersion_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_NSParagraphStyleAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSParagraphStyleAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSParagraphStyleAttributeName_FUNC);
	rc = (jlong)NSParagraphStyleAttributeName;
	OS_NATIVE_EXIT(env, that, NSParagraphStyleAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPasteboardTypeHTML
JNIEXPORT jlong JNICALL OS_NATIVE(NSPasteboardTypeHTML)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPasteboardTypeHTML_FUNC);
	rc = (jlong)NSPasteboardTypeHTML;
	OS_NATIVE_EXIT(env, that, NSPasteboardTypeHTML_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPasteboardTypeRTF
JNIEXPORT jlong JNICALL OS_NATIVE(NSPasteboardTypeRTF)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPasteboardTypeRTF_FUNC);
	rc = (jlong)NSPasteboardTypeRTF;
	OS_NATIVE_EXIT(env, that, NSPasteboardTypeRTF_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPasteboardTypeString
JNIEXPORT jlong JNICALL OS_NATIVE(NSPasteboardTypeString)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPasteboardTypeString_FUNC);
	rc = (jlong)NSPasteboardTypeString;
	OS_NATIVE_EXIT(env, that, NSPasteboardTypeString_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPointInRect
JNIEXPORT jboolean JNICALL OS_NATIVE(NSPointInRect)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1)
{
	NSPoint _arg0, *lparg0=NULL;
	NSRect _arg1, *lparg1=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, NSPointInRect_FUNC);
	if (arg0) if ((lparg0 = getNSPointFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getNSRectFields(env, arg1, &_arg1)) == NULL) goto fail;
	rc = (jboolean)NSPointInRect(*lparg0, *lparg1);
fail:
	if (arg1 && lparg1) setNSRectFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSPointFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, NSPointInRect_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPoint_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(NSPoint_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, NSPoint_1sizeof_FUNC);
	rc = (jint)NSPoint_sizeof();
	OS_NATIVE_EXIT(env, that, NSPoint_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintAllPages
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintAllPages)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintAllPages_FUNC);
	rc = (jlong)NSPrintAllPages;
	OS_NATIVE_EXIT(env, that, NSPrintAllPages_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintCopies
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintCopies)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintCopies_FUNC);
	rc = (jlong)NSPrintCopies;
	OS_NATIVE_EXIT(env, that, NSPrintCopies_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintFirstPage
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintFirstPage)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintFirstPage_FUNC);
	rc = (jlong)NSPrintFirstPage;
	OS_NATIVE_EXIT(env, that, NSPrintFirstPage_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintJobDisposition
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintJobDisposition)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintJobDisposition_FUNC);
	rc = (jlong)NSPrintJobDisposition;
	OS_NATIVE_EXIT(env, that, NSPrintJobDisposition_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintLastPage
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintLastPage)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintLastPage_FUNC);
	rc = (jlong)NSPrintLastPage;
	OS_NATIVE_EXIT(env, that, NSPrintLastPage_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintMustCollate
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintMustCollate)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintMustCollate_FUNC);
	rc = (jlong)NSPrintMustCollate;
	OS_NATIVE_EXIT(env, that, NSPrintMustCollate_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintOrientation
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintOrientation)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintOrientation_FUNC);
	rc = (jlong)NSPrintOrientation;
	OS_NATIVE_EXIT(env, that, NSPrintOrientation_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintPreviewJob
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintPreviewJob)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintPreviewJob_FUNC);
	rc = (jlong)NSPrintPreviewJob;
	OS_NATIVE_EXIT(env, that, NSPrintPreviewJob_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintSaveJob
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintSaveJob)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintSaveJob_FUNC);
	rc = (jlong)NSPrintSaveJob;
	OS_NATIVE_EXIT(env, that, NSPrintSaveJob_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintSavePath
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintSavePath)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintSavePath_FUNC);
	rc = (jlong)NSPrintSavePath;
	OS_NATIVE_EXIT(env, that, NSPrintSavePath_FUNC);
	return rc;
}
#endif

#ifndef NO_NSPrintScalingFactor
JNIEXPORT jlong JNICALL OS_NATIVE(NSPrintScalingFactor)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSPrintScalingFactor_FUNC);
	rc = (jlong)NSPrintScalingFactor;
	OS_NATIVE_EXIT(env, that, NSPrintScalingFactor_FUNC);
	return rc;
}
#endif

#ifndef NO_NSRange_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(NSRange_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, NSRange_1sizeof_FUNC);
	rc = (jint)NSRange_sizeof();
	OS_NATIVE_EXIT(env, that, NSRange_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_NSRectFillUsingOperation
JNIEXPORT void JNICALL OS_NATIVE(NSRectFillUsingOperation)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1)
{
	NSRect _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, NSRectFillUsingOperation_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	NSRectFillUsingOperation(*lparg0, (NSCompositingOperation)arg1);
fail:
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, NSRectFillUsingOperation_FUNC);
}
#endif

#ifndef NO_NSRect_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(NSRect_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, NSRect_1sizeof_FUNC);
	rc = (jint)NSRect_sizeof();
	OS_NATIVE_EXIT(env, that, NSRect_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_NSSearchPathForDirectoriesInDomains
JNIEXPORT jlong JNICALL OS_NATIVE(NSSearchPathForDirectoriesInDomains)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSSearchPathForDirectoriesInDomains_FUNC);
	rc = (jlong)NSSearchPathForDirectoriesInDomains((NSSearchPathDirectory)arg0, (NSSearchPathDomainMask)arg1, (BOOL)arg2);
	OS_NATIVE_EXIT(env, that, NSSearchPathForDirectoriesInDomains_FUNC);
	return rc;
}
#endif

#ifndef NO_NSSize_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(NSSize_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, NSSize_1sizeof_FUNC);
	rc = (jint)NSSize_sizeof();
	OS_NATIVE_EXIT(env, that, NSSize_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_NSSquareStatusItemLength
JNIEXPORT jdouble JNICALL OS_NATIVE(NSSquareStatusItemLength)
	(JNIEnv *env, jclass that)
{
	jdouble rc = 0;
	OS_NATIVE_ENTER(env, that, NSSquareStatusItemLength_FUNC);
	rc = (jdouble)NSSquareStatusItemLength;
	OS_NATIVE_EXIT(env, that, NSSquareStatusItemLength_FUNC);
	return rc;
}
#endif

#ifndef NO_NSStrikethroughColorAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSStrikethroughColorAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSStrikethroughColorAttributeName_FUNC);
	rc = (jlong)NSStrikethroughColorAttributeName;
	OS_NATIVE_EXIT(env, that, NSStrikethroughColorAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSStrikethroughStyleAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSStrikethroughStyleAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSStrikethroughStyleAttributeName_FUNC);
	rc = (jlong)NSStrikethroughStyleAttributeName;
	OS_NATIVE_EXIT(env, that, NSStrikethroughStyleAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSStrokeWidthAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSStrokeWidthAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSStrokeWidthAttributeName_FUNC);
	rc = (jlong)NSStrokeWidthAttributeName;
	OS_NATIVE_EXIT(env, that, NSStrokeWidthAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSSystemColorsDidChangeNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSSystemColorsDidChangeNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSSystemColorsDidChangeNotification_FUNC);
	rc = (jlong)NSSystemColorsDidChangeNotification;
	OS_NATIVE_EXIT(env, that, NSSystemColorsDidChangeNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSTIFFPboardType
JNIEXPORT jlong JNICALL OS_NATIVE(NSTIFFPboardType)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSTIFFPboardType_FUNC);
	rc = (jlong)NSTIFFPboardType;
	OS_NATIVE_EXIT(env, that, NSTIFFPboardType_FUNC);
	return rc;
}
#endif

#ifndef NO_NSToolbarFlexibleSpaceItemIdentifier
JNIEXPORT jlong JNICALL OS_NATIVE(NSToolbarFlexibleSpaceItemIdentifier)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSToolbarFlexibleSpaceItemIdentifier_FUNC);
	rc = (jlong)NSToolbarFlexibleSpaceItemIdentifier;
	OS_NATIVE_EXIT(env, that, NSToolbarFlexibleSpaceItemIdentifier_FUNC);
	return rc;
}
#endif

#ifndef NO_NSToolbarSpaceItemIdentifier
JNIEXPORT jlong JNICALL OS_NATIVE(NSToolbarSpaceItemIdentifier)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSToolbarSpaceItemIdentifier_FUNC);
	rc = (jlong)NSToolbarSpaceItemIdentifier;
	OS_NATIVE_EXIT(env, that, NSToolbarSpaceItemIdentifier_FUNC);
	return rc;
}
#endif

#ifndef NO_NSURLPboardType
JNIEXPORT jlong JNICALL OS_NATIVE(NSURLPboardType)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSURLPboardType_FUNC);
	rc = (jlong)NSURLPboardType;
	OS_NATIVE_EXIT(env, that, NSURLPboardType_FUNC);
	return rc;
}
#endif

#ifndef NO_NSUnderlineColorAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSUnderlineColorAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSUnderlineColorAttributeName_FUNC);
	rc = (jlong)NSUnderlineColorAttributeName;
	OS_NATIVE_EXIT(env, that, NSUnderlineColorAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSUnderlineStyleAttributeName
JNIEXPORT jlong JNICALL OS_NATIVE(NSUnderlineStyleAttributeName)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSUnderlineStyleAttributeName_FUNC);
	rc = (jlong)NSUnderlineStyleAttributeName;
	OS_NATIVE_EXIT(env, that, NSUnderlineStyleAttributeName_FUNC);
	return rc;
}
#endif

#ifndef NO_NSViewGlobalFrameDidChangeNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSViewGlobalFrameDidChangeNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSViewGlobalFrameDidChangeNotification_FUNC);
	rc = (jlong)NSViewGlobalFrameDidChangeNotification;
	OS_NATIVE_EXIT(env, that, NSViewGlobalFrameDidChangeNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSWindowDidBecomeKeyNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSWindowDidBecomeKeyNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSWindowDidBecomeKeyNotification_FUNC);
	rc = (jlong)NSWindowDidBecomeKeyNotification;
	OS_NATIVE_EXIT(env, that, NSWindowDidBecomeKeyNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSWindowDidDeminiaturizeNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSWindowDidDeminiaturizeNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSWindowDidDeminiaturizeNotification_FUNC);
	rc = (jlong)NSWindowDidDeminiaturizeNotification;
	OS_NATIVE_EXIT(env, that, NSWindowDidDeminiaturizeNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSWindowDidMiniaturizeNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSWindowDidMiniaturizeNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSWindowDidMiniaturizeNotification_FUNC);
	rc = (jlong)NSWindowDidMiniaturizeNotification;
	OS_NATIVE_EXIT(env, that, NSWindowDidMiniaturizeNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSWindowDidMoveNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSWindowDidMoveNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSWindowDidMoveNotification_FUNC);
	rc = (jlong)NSWindowDidMoveNotification;
	OS_NATIVE_EXIT(env, that, NSWindowDidMoveNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSWindowDidResignKeyNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSWindowDidResignKeyNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSWindowDidResignKeyNotification_FUNC);
	rc = (jlong)NSWindowDidResignKeyNotification;
	OS_NATIVE_EXIT(env, that, NSWindowDidResignKeyNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSWindowDidResizeNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSWindowDidResizeNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSWindowDidResizeNotification_FUNC);
	rc = (jlong)NSWindowDidResizeNotification;
	OS_NATIVE_EXIT(env, that, NSWindowDidResizeNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NSWindowWillCloseNotification
JNIEXPORT jlong JNICALL OS_NATIVE(NSWindowWillCloseNotification)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NSWindowWillCloseNotification_FUNC);
	rc = (jlong)NSWindowWillCloseNotification;
	OS_NATIVE_EXIT(env, that, NSWindowWillCloseNotification_FUNC);
	return rc;
}
#endif

#ifndef NO_NewGlobalRef
JNIEXPORT jlong JNICALL OS_NATIVE(NewGlobalRef)
	(JNIEnv *env, jclass that, jobject arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NewGlobalRef_FUNC);
	rc = (jlong)(*env)->NewGlobalRef(env, arg0);
	OS_NATIVE_EXIT(env, that, NewGlobalRef_FUNC);
	return rc;
}
#endif

#ifndef NO_NewRgn
JNIEXPORT jlong JNICALL OS_NATIVE(NewRgn)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, NewRgn_FUNC);
/*
	rc = (jlong)NewRgn();
*/
	{
		OS_LOAD_FUNCTION(fp, NewRgn)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	OS_NATIVE_EXIT(env, that, NewRgn_FUNC);
	return rc;
}
#endif

#ifndef NO_OffsetRgn
JNIEXPORT void JNICALL OS_NATIVE(OffsetRgn)
	(JNIEnv *env, jclass that, jlong arg0, jshort arg1, jshort arg2)
{
	OS_NATIVE_ENTER(env, that, OffsetRgn_FUNC);
/*
	OffsetRgn(arg0, arg1, arg2);
*/
	{
		OS_LOAD_FUNCTION(fp, OffsetRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jshort, jshort))fp)(arg0, arg1, arg2);
		}
	}
	OS_NATIVE_EXIT(env, that, OffsetRgn_FUNC);
}
#endif

#ifndef NO_OpenRgn
JNIEXPORT void JNICALL OS_NATIVE(OpenRgn)
	(JNIEnv *env, jclass that)
{
	OS_NATIVE_ENTER(env, that, OpenRgn_FUNC);
/*
	OpenRgn();
*/
	{
		OS_LOAD_FUNCTION(fp, OpenRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)())fp)();
		}
	}
	OS_NATIVE_EXIT(env, that, OpenRgn_FUNC);
}
#endif

#ifndef NO_PMGetDuplex
JNIEXPORT jlong JNICALL OS_NATIVE(PMGetDuplex)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PMGetDuplex_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	rc = (jlong)PMGetDuplex((PMPrintSettings)arg0, (PMDuplexMode *)lparg1);
*/
	{
		OS_LOAD_FUNCTION(fp, PMGetDuplex)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(PMPrintSettings, PMDuplexMode *))fp)((PMPrintSettings)arg0, (PMDuplexMode *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, PMGetDuplex_FUNC);
	return rc;
}
#endif

#ifndef NO_PMPrinterGetIndexedPrinterResolution
JNIEXPORT jlong JNICALL OS_NATIVE(PMPrinterGetIndexedPrinterResolution)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2)
{
	PMResolution _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PMPrinterGetIndexedPrinterResolution_FUNC);
	if (arg2) if ((lparg2 = getPMResolutionFields(env, arg2, &_arg2)) == NULL) goto fail;
/*
	rc = (jlong)PMPrinterGetIndexedPrinterResolution((PMPrinter)arg0, arg1, (PMResolution *)lparg2);
*/
	{
		OS_LOAD_FUNCTION(fp, PMPrinterGetIndexedPrinterResolution)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(PMPrinter, jint, PMResolution *))fp)((PMPrinter)arg0, arg1, (PMResolution *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) setPMResolutionFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, PMPrinterGetIndexedPrinterResolution_FUNC);
	return rc;
}
#endif

#ifndef NO_PMPrinterGetOutputResolution
JNIEXPORT jlong JNICALL OS_NATIVE(PMPrinterGetOutputResolution)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2)
{
	PMResolution _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PMPrinterGetOutputResolution_FUNC);
	if (arg2) if ((lparg2 = getPMResolutionFields(env, arg2, &_arg2)) == NULL) goto fail;
/*
	rc = (jlong)PMPrinterGetOutputResolution((PMPrinter)arg0, (PMPrintSettings)arg1, (PMResolution *)lparg2);
*/
	{
		OS_LOAD_FUNCTION(fp, PMPrinterGetOutputResolution)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(PMPrinter, PMPrintSettings, PMResolution *))fp)((PMPrinter)arg0, (PMPrintSettings)arg1, (PMResolution *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) setPMResolutionFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, PMPrinterGetOutputResolution_FUNC);
	return rc;
}
#endif

#ifndef NO_PMPrinterGetPrinterResolutionCount
JNIEXPORT jlong JNICALL OS_NATIVE(PMPrinterGetPrinterResolutionCount)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PMPrinterGetPrinterResolutionCount_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	rc = (jlong)PMPrinterGetPrinterResolutionCount((PMPrinter)arg0, (UInt32 *)lparg1);
*/
	{
		OS_LOAD_FUNCTION(fp, PMPrinterGetPrinterResolutionCount)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(PMPrinter, UInt32 *))fp)((PMPrinter)arg0, (UInt32 *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, PMPrinterGetPrinterResolutionCount_FUNC);
	return rc;
}
#endif

#ifndef NO_PMSessionGetCurrentPrinter
JNIEXPORT jlong JNICALL OS_NATIVE(PMSessionGetCurrentPrinter)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PMSessionGetCurrentPrinter_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	rc = (jlong)PMSessionGetCurrentPrinter((PMPrintSession)arg0, (PMPrinter *)lparg1);
*/
	{
		OS_LOAD_FUNCTION(fp, PMSessionGetCurrentPrinter)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(PMPrintSession, PMPrinter *))fp)((PMPrintSession)arg0, (PMPrinter *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, PMSessionGetCurrentPrinter_FUNC);
	return rc;
}
#endif

#ifndef NO_PMSessionGetDestinationType
JNIEXPORT jlong JNICALL OS_NATIVE(PMSessionGetDestinationType)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jshortArray arg2)
{
	jshort *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PMSessionGetDestinationType_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetShortArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	rc = (jlong)PMSessionGetDestinationType((PMPrintSession)arg0, (PMPrintSettings)arg1, lparg2);
*/
	{
		OS_LOAD_FUNCTION(fp, PMSessionGetDestinationType)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(PMPrintSession, PMPrintSettings, jshort *))fp)((PMPrintSession)arg0, (PMPrintSettings)arg1, lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseShortArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, PMSessionGetDestinationType_FUNC);
	return rc;
}
#endif

#ifndef NO_PMSetDuplex
JNIEXPORT jlong JNICALL OS_NATIVE(PMSetDuplex)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PMSetDuplex_FUNC);
/*
	rc = (jlong)PMSetDuplex((PMPrintSettings)arg0, (PMDuplexMode)arg1);
*/
	{
		OS_LOAD_FUNCTION(fp, PMSetDuplex)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(PMPrintSettings, PMDuplexMode))fp)((PMPrintSettings)arg0, (PMDuplexMode)arg1);
		}
	}
	OS_NATIVE_EXIT(env, that, PMSetDuplex_FUNC);
	return rc;
}
#endif

#ifndef NO_PtInRgn
JNIEXPORT jboolean JNICALL OS_NATIVE(PtInRgn)
	(JNIEnv *env, jclass that, jshortArray arg0, jlong arg1)
{
	jshort *lparg0=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, PtInRgn_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetShortArrayElements(env, arg0, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)PtInRgn(*(Point *)lparg0, arg1);
*/
	{
		OS_LOAD_FUNCTION(fp, PtInRgn)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(Point, jlong))fp)(*(Point *)lparg0, arg1);
		}
	}
fail:
	if (arg0 && lparg0) (*env)->ReleaseShortArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, PtInRgn_FUNC);
	return rc;
}
#endif

#ifndef NO_QDRegionToRects
JNIEXPORT jint JNICALL OS_NATIVE(QDRegionToRects)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2, jlong arg3)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, QDRegionToRects_FUNC);
/*
	rc = (jint)QDRegionToRects(arg0, arg1, arg2, arg3);
*/
	{
		OS_LOAD_FUNCTION(fp, QDRegionToRects)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(jlong, jint, jlong, jlong))fp)(arg0, arg1, arg2, arg3);
		}
	}
	OS_NATIVE_EXIT(env, that, QDRegionToRects_FUNC);
	return rc;
}
#endif

#ifndef NO_RectInRgn
JNIEXPORT jboolean JNICALL OS_NATIVE(RectInRgn)
	(JNIEnv *env, jclass that, jshortArray arg0, jlong arg1)
{
	jshort *lparg0=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, RectInRgn_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetShortArrayElements(env, arg0, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)RectInRgn(lparg0, arg1);
*/
	{
		OS_LOAD_FUNCTION(fp, RectInRgn)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jshort *, jlong))fp)(lparg0, arg1);
		}
	}
fail:
	if (arg0 && lparg0) (*env)->ReleaseShortArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, RectInRgn_FUNC);
	return rc;
}
#endif

#ifndef NO_RectRgn
JNIEXPORT void JNICALL OS_NATIVE(RectRgn)
	(JNIEnv *env, jclass that, jlong arg0, jshortArray arg1)
{
	jshort *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, RectRgn_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetShortArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	RectRgn(arg0, lparg1);
*/
	{
		OS_LOAD_FUNCTION(fp, RectRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jshort *))fp)(arg0, lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseShortArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, RectRgn_FUNC);
}
#endif

#ifndef NO_SecPolicySearchCopyNext
JNIEXPORT jint JNICALL OS_NATIVE(SecPolicySearchCopyNext)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, SecPolicySearchCopyNext_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jint)SecPolicySearchCopyNext((SecPolicySearchRef)arg0, (SecPolicyRef *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, SecPolicySearchCopyNext_FUNC);
	return rc;
}
#endif

#ifndef NO_SecPolicySearchCreate
JNIEXPORT jint JNICALL OS_NATIVE(SecPolicySearchCreate)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlongArray arg3)
{
	jlong *lparg3=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, SecPolicySearchCreate_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	rc = (jint)SecPolicySearchCreate((CSSM_CERT_TYPE)arg0, (CSSM_OID *)arg1, (CSSM_DATA *)arg2, (SecPolicySearchRef *)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	OS_NATIVE_EXIT(env, that, SecPolicySearchCreate_FUNC);
	return rc;
}
#endif

#ifndef NO_SecTrustCreateWithCertificates
JNIEXPORT jint JNICALL OS_NATIVE(SecTrustCreateWithCertificates)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2)
{
	jlong *lparg2=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, SecTrustCreateWithCertificates_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jint)SecTrustCreateWithCertificates((CFArrayRef)arg0, (CFTypeRef)arg1, (SecTrustRef *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, SecTrustCreateWithCertificates_FUNC);
	return rc;
}
#endif

#ifndef NO_SectRgn
JNIEXPORT void JNICALL OS_NATIVE(SectRgn)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, SectRgn_FUNC);
/*
	SectRgn(arg0, arg1, arg2);
*/
	{
		OS_LOAD_FUNCTION(fp, SectRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong, jlong))fp)(arg0, arg1, arg2);
		}
	}
	OS_NATIVE_EXIT(env, that, SectRgn_FUNC);
}
#endif

#ifndef NO_SetRect
JNIEXPORT void JNICALL OS_NATIVE(SetRect)
	(JNIEnv *env, jclass that, jshortArray arg0, jshort arg1, jshort arg2, jshort arg3, jshort arg4)
{
	jshort *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, SetRect_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetShortArrayElements(env, arg0, NULL)) == NULL) goto fail;
/*
	SetRect(lparg0, arg1, arg2, arg3, arg4);
*/
	{
		OS_LOAD_FUNCTION(fp, SetRect)
		if (fp) {
			((void (CALLING_CONVENTION*)(jshort *, jshort, jshort, jshort, jshort))fp)(lparg0, arg1, arg2, arg3, arg4);
		}
	}
fail:
	if (arg0 && lparg0) (*env)->ReleaseShortArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, SetRect_FUNC);
}
#endif

#ifndef NO_SetSystemUIMode
JNIEXPORT jint JNICALL OS_NATIVE(SetSystemUIMode)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, SetSystemUIMode_FUNC);
/*
	rc = (jint)SetSystemUIMode((UInt32)arg0, (UInt32)arg1);
*/
	{
		OS_LOAD_FUNCTION(fp, SetSystemUIMode)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(UInt32, UInt32))fp)((UInt32)arg0, (UInt32)arg1);
		}
	}
	OS_NATIVE_EXIT(env, that, SetSystemUIMode_FUNC);
	return rc;
}
#endif

#ifndef NO_TISCopyCurrentKeyboardInputSource
JNIEXPORT jlong JNICALL OS_NATIVE(TISCopyCurrentKeyboardInputSource)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, TISCopyCurrentKeyboardInputSource_FUNC);
/*
	rc = (jlong)TISCopyCurrentKeyboardInputSource();
*/
	{
		OS_LOAD_FUNCTION(fp, TISCopyCurrentKeyboardInputSource)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	OS_NATIVE_EXIT(env, that, TISCopyCurrentKeyboardInputSource_FUNC);
	return rc;
}
#endif

#ifndef NO_TISGetInputSourceProperty
JNIEXPORT jlong JNICALL OS_NATIVE(TISGetInputSourceProperty)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, TISGetInputSourceProperty_FUNC);
/*
	rc = (jlong)TISGetInputSourceProperty((TISInputSourceRef)arg0, (CFStringRef)arg1);
*/
	{
		OS_LOAD_FUNCTION(fp, TISGetInputSourceProperty)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(TISInputSourceRef, CFStringRef))fp)((TISInputSourceRef)arg0, (CFStringRef)arg1);
		}
	}
	OS_NATIVE_EXIT(env, that, TISGetInputSourceProperty_FUNC);
	return rc;
}
#endif

#ifndef NO_UCKeyTranslate
JNIEXPORT jint JNICALL OS_NATIVE(UCKeyTranslate)
	(JNIEnv *env, jclass that, jlong arg0, jshort arg1, jshort arg2, jint arg3, jint arg4, jint arg5, jintArray arg6, jint arg7, jlongArray arg8, jcharArray arg9)
{
	jint *lparg6=NULL;
	jlong *lparg8=NULL;
	jchar *lparg9=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, UCKeyTranslate_FUNC);
	if (arg6) if ((lparg6 = (*env)->GetIntArrayElements(env, arg6, NULL)) == NULL) goto fail;
	if (arg8) if ((lparg8 = (*env)->GetLongArrayElements(env, arg8, NULL)) == NULL) goto fail;
	if (arg9) if ((lparg9 = (*env)->GetCharArrayElements(env, arg9, NULL)) == NULL) goto fail;
/*
	rc = (jint)UCKeyTranslate((const UCKeyboardLayout *)arg0, (UInt16)arg1, (UInt16)arg2, (UInt32)arg3, (UInt32)arg4, (OptionBits)arg5, (UInt32 *)lparg6, (UniCharCount)arg7, (UniCharCount *)lparg8, (UniChar *)lparg9);
*/
	{
		OS_LOAD_FUNCTION(fp, UCKeyTranslate)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(const UCKeyboardLayout *, UInt16, UInt16, UInt32, UInt32, OptionBits, UInt32 *, UniCharCount, UniCharCount *, UniChar *))fp)((const UCKeyboardLayout *)arg0, (UInt16)arg1, (UInt16)arg2, (UInt32)arg3, (UInt32)arg4, (OptionBits)arg5, (UInt32 *)lparg6, (UniCharCount)arg7, (UniCharCount *)lparg8, (UniChar *)lparg9);
		}
	}
fail:
	if (arg9 && lparg9) (*env)->ReleaseCharArrayElements(env, arg9, lparg9, 0);
	if (arg8 && lparg8) (*env)->ReleaseLongArrayElements(env, arg8, lparg8, 0);
	if (arg6 && lparg6) (*env)->ReleaseIntArrayElements(env, arg6, lparg6, 0);
	OS_NATIVE_EXIT(env, that, UCKeyTranslate_FUNC);
	return rc;
}
#endif

#ifndef NO_UTTypeEqual
JNIEXPORT jboolean JNICALL OS_NATIVE(UTTypeEqual)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, UTTypeEqual_FUNC);
	rc = (jboolean)UTTypeEqual((CFStringRef)arg0, (CFStringRef)arg1);
	OS_NATIVE_EXIT(env, that, UTTypeEqual_FUNC);
	return rc;
}
#endif

#ifndef NO_UnionRgn
JNIEXPORT void JNICALL OS_NATIVE(UnionRgn)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, UnionRgn_FUNC);
/*
	UnionRgn(arg0, arg1, arg2);
*/
	{
		OS_LOAD_FUNCTION(fp, UnionRgn)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong, jlong))fp)(arg0, arg1, arg2);
		}
	}
	OS_NATIVE_EXIT(env, that, UnionRgn_FUNC);
}
#endif

#ifndef NO_call
JNIEXPORT void JNICALL OS_NATIVE(call)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, call_FUNC);
	((void (*)())arg0)(arg1, arg2);
	OS_NATIVE_EXIT(env, that, call_FUNC);
}
#endif

#ifndef NO_class_1addIvar
JNIEXPORT jboolean JNICALL OS_NATIVE(class_1addIvar)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jbyte arg3, jbyteArray arg4)
{
	jbyte *lparg1=NULL;
	jbyte *lparg4=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, class_1addIvar_FUNC);
		if (arg1) if ((lparg1 = (*env)->GetPrimitiveArrayCritical(env, arg1, NULL)) == NULL) goto fail;
		if (arg4) if ((lparg4 = (*env)->GetPrimitiveArrayCritical(env, arg4, NULL)) == NULL) goto fail;
	rc = (jboolean)class_addIvar((Class)arg0, (const char *)lparg1, arg2, arg3, (const char *)lparg4);
fail:
		if (arg4 && lparg4) (*env)->ReleasePrimitiveArrayCritical(env, arg4, lparg4, 0);
		if (arg1 && lparg1) (*env)->ReleasePrimitiveArrayCritical(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, class_1addIvar_FUNC);
	return rc;
}
#endif

#ifndef NO_class_1addMethod
JNIEXPORT jboolean JNICALL OS_NATIVE(class_1addMethod)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jstring arg3)
{
	const char *lparg3= NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, class_1addMethod_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetStringUTFChars(env, arg3, NULL)) == NULL) goto fail;
	rc = (jboolean)class_addMethod((Class)arg0, (SEL)arg1, (IMP)arg2, lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseStringUTFChars(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, class_1addMethod_FUNC);
	return rc;
}
#endif

#ifndef NO_class_1addProtocol
JNIEXPORT jboolean JNICALL OS_NATIVE(class_1addProtocol)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, class_1addProtocol_FUNC);
	rc = (jboolean)class_addProtocol((Class)arg0, (Protocol *)arg1);
	OS_NATIVE_EXIT(env, that, class_1addProtocol_FUNC);
	return rc;
}
#endif

#ifndef NO_class_1createInstance
JNIEXPORT jlong JNICALL OS_NATIVE(class_1createInstance)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, class_1createInstance_FUNC);
	rc = (jlong)class_createInstance((Class)arg0, (size_t)arg1);
	OS_NATIVE_EXIT(env, that, class_1createInstance_FUNC);
	return rc;
}
#endif

#ifndef NO_class_1getClassMethod
JNIEXPORT jlong JNICALL OS_NATIVE(class_1getClassMethod)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, class_1getClassMethod_FUNC);
	rc = (jlong)class_getClassMethod((Class)arg0, (SEL)arg1);
	OS_NATIVE_EXIT(env, that, class_1getClassMethod_FUNC);
	return rc;
}
#endif

#ifndef NO_class_1getInstanceMethod
JNIEXPORT jlong JNICALL OS_NATIVE(class_1getInstanceMethod)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, class_1getInstanceMethod_FUNC);
	rc = (jlong)class_getInstanceMethod((Class)arg0, (SEL)arg1);
	OS_NATIVE_EXIT(env, that, class_1getInstanceMethod_FUNC);
	return rc;
}
#endif

#ifndef NO_class_1getMethodImplementation
JNIEXPORT jlong JNICALL OS_NATIVE(class_1getMethodImplementation)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, class_1getMethodImplementation_FUNC);
	rc = (jlong)class_getMethodImplementation((Class)arg0, (SEL)arg1);
	OS_NATIVE_EXIT(env, that, class_1getMethodImplementation_FUNC);
	return rc;
}
#endif

#ifndef NO_class_1getSuperclass
JNIEXPORT jlong JNICALL OS_NATIVE(class_1getSuperclass)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, class_1getSuperclass_FUNC);
	rc = (jlong)class_getSuperclass((Class)arg0);
	OS_NATIVE_EXIT(env, that, class_1getSuperclass_FUNC);
	return rc;
}
#endif

#ifndef NO_getpid
JNIEXPORT jint JNICALL OS_NATIVE(getpid)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, getpid_FUNC);
	rc = (jint)getpid();
	OS_NATIVE_EXIT(env, that, getpid_FUNC);
	return rc;
}
#endif

#ifndef NO_instrumentObjcMessageSends
JNIEXPORT void JNICALL OS_NATIVE(instrumentObjcMessageSends)
	(JNIEnv *env, jclass that, jboolean arg0)
{
	OS_NATIVE_ENTER(env, that, instrumentObjcMessageSends_FUNC);
/*
	instrumentObjcMessageSends(arg0);
*/
	{
		OS_LOAD_FUNCTION(fp, instrumentObjcMessageSends)
		if (fp) {
			((void (CALLING_CONVENTION*)(jboolean))fp)(arg0);
		}
	}
	OS_NATIVE_EXIT(env, that, instrumentObjcMessageSends_FUNC);
}
#endif

#ifndef NO_kCFAllocatorDefault
JNIEXPORT jlong JNICALL OS_NATIVE(kCFAllocatorDefault)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, kCFAllocatorDefault_FUNC);
	rc = (jlong)kCFAllocatorDefault;
	OS_NATIVE_EXIT(env, that, kCFAllocatorDefault_FUNC);
	return rc;
}
#endif

#ifndef NO_kCFRunLoopCommonModes
JNIEXPORT jlong JNICALL OS_NATIVE(kCFRunLoopCommonModes)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, kCFRunLoopCommonModes_FUNC);
	rc = (jlong)kCFRunLoopCommonModes;
	OS_NATIVE_EXIT(env, that, kCFRunLoopCommonModes_FUNC);
	return rc;
}
#endif

#ifndef NO_kUTTypeFileURL
JNIEXPORT jlong JNICALL OS_NATIVE(kUTTypeFileURL)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, kUTTypeFileURL_FUNC);
	rc = (jlong)kUTTypeFileURL;
	OS_NATIVE_EXIT(env, that, kUTTypeFileURL_FUNC);
	return rc;
}
#endif

#ifndef NO_kUTTypeURL
JNIEXPORT jlong JNICALL OS_NATIVE(kUTTypeURL)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, kUTTypeURL_FUNC);
	rc = (jlong)kUTTypeURL;
	OS_NATIVE_EXIT(env, that, kUTTypeURL_FUNC);
	return rc;
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_cocoa_CGPathElement_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_cocoa_CGPathElement_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	CGPathElement _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_CGPathElement_2J_FUNC);
	if (arg1) if ((lparg1 = getCGPathElementFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (void *)lparg1, arg2);
fail:
	if (arg1 && lparg1) setCGPathElementFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_CGPathElement_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_cocoa_NSPoint_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_cocoa_NSPoint_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	NSPoint _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	if (arg1) if ((lparg1 = getNSPointFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (void *)lparg1, arg2);
fail:
	if (arg1 && lparg1) setNSPointFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_cocoa_NSRange_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_cocoa_NSRange_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	NSRange _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	if (arg1) if ((lparg1 = getNSRangeFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (void *)lparg1, arg2);
fail:
	if (arg1 && lparg1) setNSRangeFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	NSRect _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg1) if ((lparg1 = getNSRectFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (void *)lparg1, arg2);
fail:
	if (arg1 && lparg1) setNSRectFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_cocoa_NSSize_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_cocoa_NSSize_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	NSSize _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_NSSize_2J_FUNC);
	if (arg1) if ((lparg1 = getNSSizeFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (void *)lparg1, arg2);
fail:
	if (arg1 && lparg1) setNSSizeFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_cocoa_NSSize_2J_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_cocoa_CGPathElement_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_cocoa_CGPathElement_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	CGPathElement _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_CGPathElement_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (void *)arg1, arg2);
fail:
	if (arg0 && lparg0) setCGPathElementFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_CGPathElement_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSPoint _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (void *)arg1, arg2);
fail:
	if (arg0 && lparg0) setNSPointFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSRange _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (void *)arg1, arg2);
fail:
	if (arg0 && lparg0) setNSRangeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSRect _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (void *)arg1, arg2);
fail:
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSSize _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (void *)arg1, arg2);
fail:
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJ_FUNC);
}
#endif

#ifndef NO_method_1setImplementation
JNIEXPORT jlong JNICALL OS_NATIVE(method_1setImplementation)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, method_1setImplementation_FUNC);
	rc = (jlong)method_setImplementation((Method)arg0, (IMP)arg1);
	OS_NATIVE_EXIT(env, that, method_1setImplementation_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1allocateClassPair
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1allocateClassPair)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1, jlong arg2)
{
	const char *lparg1= NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1allocateClassPair_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)objc_allocateClassPair((Class)arg0, lparg1, arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, objc_1allocateClassPair_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1disposeClassPair
JNIEXPORT void JNICALL OS_NATIVE(objc_1disposeClassPair)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, objc_1disposeClassPair_FUNC);
	objc_disposeClassPair((Class)arg0);
	OS_NATIVE_EXIT(env, that, objc_1disposeClassPair_FUNC);
}
#endif

#ifndef NO_objc_1getClass
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1getClass)
	(JNIEnv *env, jclass that, jstring arg0)
{
	const char *lparg0= NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1getClass_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetStringUTFChars(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)objc_getClass(lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseStringUTFChars(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1getClass_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1getMetaClass
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1getMetaClass)
	(JNIEnv *env, jclass that, jstring arg0)
{
	const char *lparg0= NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1getMetaClass_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetStringUTFChars(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)objc_getMetaClass(lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseStringUTFChars(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1getMetaClass_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1getProtocol
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1getProtocol)
	(JNIEnv *env, jclass that, jstring arg0)
{
	const char *lparg0= NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1getProtocol_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetStringUTFChars(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)objc_getProtocol(lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseStringUTFChars(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1getProtocol_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1lookUpClass
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1lookUpClass)
	(JNIEnv *env, jclass that, jstring arg0)
{
	const char *lparg0= NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1lookUpClass_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetStringUTFChars(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)objc_lookUpClass(lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseStringUTFChars(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1lookUpClass_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong))objc_msgSend)(arg0, arg1);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJD
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJD)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJD_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jdouble))objc_msgSend)(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJD_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJDD
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJDD)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJDD_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jdouble, jdouble))objc_msgSend)(arg0, arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJDD_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJDDDD
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJDDDD)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3, jdouble arg4, jdouble arg5)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJDDDD_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jdouble, jdouble, jdouble, jdouble))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJDDDD_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJDJJJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJDJJJZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jlong arg3, jlong arg4, jlong arg5, jboolean arg6)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJDJJJZ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jdouble, jlong, jlong, jlong, jboolean))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJDJJJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJI
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJI_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jint))objc_msgSend)(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJI_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJD
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJD)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jdouble arg3)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJD_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jdouble))objc_msgSend)(arg0, arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJD_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJDJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJDJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jdouble arg4, jlong arg5)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJDJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jdouble, jlong))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJDJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, arg3, arg4);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJJJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJJJJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6, jlong arg7)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJJJJJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jlong, jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJJJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6, jlong arg7, jlong arg8)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJJJJJJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jlong, jlong, jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJJJJZZJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJJJJZZJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6, jboolean arg7, jboolean arg8, jlong arg9, jlong arg10, jlong arg11, jlong arg12)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJJJJZZJJJJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jlong, jlong, jlong, jboolean, jboolean, jlong, jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJJJJZZJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJJZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jboolean arg5)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJJZ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jlong, jboolean))objc_msgSend)(arg0, arg1, arg2, arg3, arg4, arg5);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJLorg_eclipse_swt_internal_cocoa_NSRange_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJLorg_eclipse_swt_internal_cocoa_NSRange_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jobject arg4)
{
	NSRange _arg4, *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJLorg_eclipse_swt_internal_cocoa_NSRange_2_FUNC);
	if (arg4) if ((lparg4 = getNSRangeFields(env, arg4, &_arg4)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, NSRange))objc_msgSend)(arg0, arg1, arg2, arg3, *lparg4);
fail:
	if (arg4 && lparg4) setNSRangeFields(env, arg4, lparg4);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJLorg_eclipse_swt_internal_cocoa_NSRange_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJJZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jboolean arg4)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJJZ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jlong, jboolean))objc_msgSend)(arg0, arg1, arg2, arg3, arg4);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3)
{
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, NSPoint))objc_msgSend)(arg0, arg1, arg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, NSPoint, jlong))objc_msgSend)(arg0, arg1, arg2, *lparg3, arg4);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2JDJJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2JDJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4, jdouble arg5, jlong arg6, jlong arg7, jlong arg8, jlong arg9, jlong arg10)
{
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2JDJJJJJ_FUNC);
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, NSPoint, jlong, jdouble, jlong, jlong, jlong, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, *lparg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2JDJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2JDJJSJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2JDJJSJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4, jdouble arg5, jlong arg6, jlong arg7, jshort arg8, jlong arg9, jlong arg10)
{
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2JDJJSJJ_FUNC);
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, NSPoint, jlong, jdouble, jlong, jlong, jshort, jlong, jlong))objc_msgSend)(arg0, arg1, arg2, *lparg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2JDJJSJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSSize_2JJJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSSize_2JJJZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3, jobject arg4, jlong arg5, jlong arg6, jlong arg7, jboolean arg8)
{
	NSPoint _arg3, *lparg3=NULL;
	NSSize _arg4, *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSSize_2JJJZ_FUNC);
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (arg4) if ((lparg4 = getNSSizeFields(env, arg4, &_arg4)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, NSPoint, NSSize, jlong, jlong, jlong, jboolean))objc_msgSend)(arg0, arg1, arg2, *lparg3, *lparg4, arg5, arg6, arg7, arg8);
fail:
	if (arg4 && lparg4) setNSSizeFields(env, arg4, lparg4);
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSSize_2JJJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSRange_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSRange_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3)
{
	NSRange _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSRange_2_FUNC);
	if (arg3) if ((lparg3 = getNSRangeFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, NSRange))objc_msgSend)(arg0, arg1, arg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSRangeFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSRange_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	NSRect _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, NSRect, jlong))objc_msgSend)(arg0, arg1, arg2, *lparg3, arg4);
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJJZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jboolean arg3)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJJZ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jlong, jboolean))objc_msgSend)(arg0, arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSAffineTransformStruct_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSAffineTransformStruct_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2)
{
	NSAffineTransformStruct _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSAffineTransformStruct_2_FUNC);
	if (arg2) if ((lparg2 = getNSAffineTransformStructFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSAffineTransformStruct))objc_msgSend)(arg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSAffineTransformStructFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSAffineTransformStruct_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2)
{
	NSPoint _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSPoint))objc_msgSend)(arg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2DDDZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2DDDZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jdouble arg3, jdouble arg4, jdouble arg5, jboolean arg6)
{
	NSPoint _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2DDDZ_FUNC);
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSPoint, jdouble, jdouble, jdouble, jboolean))objc_msgSend)(arg0, arg1, *lparg2, arg3, arg4, arg5, arg6);
fail:
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2DDDZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3)
{
	NSPoint _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSPoint, jlong))objc_msgSend)(arg0, arg1, *lparg2, arg3);
fail:
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_3D
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_3D)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3, jdoubleArray arg4)
{
	NSPoint _arg2, *lparg2=NULL;
	jdouble *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_3D_FUNC);
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetDoubleArrayElements(env, arg4, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSPoint, jlong, jdouble *))objc_msgSend)(arg0, arg1, *lparg2, arg3, lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseDoubleArrayElements(env, arg4, lparg4, 0);
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_3D_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3, jlong arg4)
{
	NSPoint _arg2, *lparg2=NULL;
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSPoint, NSPoint, jlong))objc_msgSend)(arg0, arg1, *lparg2, *lparg3, arg4);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3, jobject arg4)
{
	NSPoint _arg2, *lparg2=NULL;
	NSPoint _arg3, *lparg3=NULL;
	NSPoint _arg4, *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (arg4) if ((lparg4 = getNSPointFields(env, arg4, &_arg4)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSPoint, NSPoint, NSPoint))objc_msgSend)(arg0, arg1, *lparg2, *lparg3, *lparg4);
fail:
	if (arg4 && lparg4) setNSPointFields(env, arg4, lparg4);
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2)
{
	NSRange _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2_FUNC);
	if (arg2) if ((lparg2 = getNSRangeFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRange))objc_msgSend)(arg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSRangeFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3)
{
	NSRange _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	if (arg2) if ((lparg2 = getNSRangeFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRange, jlong))objc_msgSend)(arg0, arg1, *lparg2, arg3);
fail:
	if (arg2 && lparg2) setNSRangeFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2JJJJ_3B
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2JJJJ_3B)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6, jbyteArray arg7)
{
	NSRange _arg2, *lparg2=NULL;
	jbyte *lparg7=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2JJJJ_3B_FUNC);
	if (arg2) if ((lparg2 = getNSRangeFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg7) if ((lparg7 = (*env)->GetByteArrayElements(env, arg7, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRange, jlong, jlong, jlong, jlong, jbyte *))objc_msgSend)(arg0, arg1, *lparg2, arg3, arg4, arg5, arg6, lparg7);
fail:
	if (arg7 && lparg7) (*env)->ReleaseByteArrayElements(env, arg7, lparg7, 0);
	if (arg2 && lparg2) setNSRangeFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2JJJJ_3B_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3)
{
	NSRange _arg2, *lparg2=NULL;
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg2) if ((lparg2 = getNSRangeFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRange, NSPoint))objc_msgSend)(arg0, arg1, *lparg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg2 && lparg2) setNSRangeFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2Lorg_eclipse_swt_internal_cocoa_NSRange_2J_3J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2Lorg_eclipse_swt_internal_cocoa_NSRange_2J_3J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3, jlong arg4, jlongArray arg5)
{
	NSRange _arg2, *lparg2=NULL;
	NSRange _arg3, *lparg3=NULL;
	jlong *lparg5=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2Lorg_eclipse_swt_internal_cocoa_NSRange_2J_3J_FUNC);
	if (arg2) if ((lparg2 = getNSRangeFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRangeFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetLongArrayElements(env, arg5, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRange, NSRange, jlong, jlong *))objc_msgSend)(arg0, arg1, *lparg2, *lparg3, arg4, lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseLongArrayElements(env, arg5, lparg5, 0);
	if (arg3 && lparg3) setNSRangeFields(env, arg3, lparg3);
	if (arg2 && lparg2) setNSRangeFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRange_2Lorg_eclipse_swt_internal_cocoa_NSRange_2J_3J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect))objc_msgSend)(arg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2D
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2D)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jdouble arg3)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2D_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jdouble))objc_msgSend)(arg0, arg1, *lparg2, arg3);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2D_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2DD
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2DD)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jdouble arg3, jdouble arg4)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2DD_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jdouble, jdouble))objc_msgSend)(arg0, arg1, *lparg2, arg3, arg4);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2DD_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jlong))objc_msgSend)(arg0, arg1, *lparg2, arg3);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3, jlong arg4)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJ_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jlong, jlong))objc_msgSend)(arg0, arg1, *lparg2, arg3, arg4);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3, jlong arg4, jboolean arg5)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJZ_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jlong, jlong, jboolean))objc_msgSend)(arg0, arg1, *lparg2, arg3, arg4, arg5);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJZJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJZJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3, jlong arg4, jboolean arg5, jlong arg6)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJZJ_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jlong, jlong, jboolean, jlong))objc_msgSend)(arg0, arg1, *lparg2, arg3, arg4, arg5, arg6);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JJZJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JZJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JZJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3, jboolean arg4, jlong arg5)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JZJ_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jlong, jboolean, jlong))objc_msgSend)(arg0, arg1, *lparg2, arg3, arg4, arg5);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2JZJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3)
{
	NSRect _arg2, *lparg2=NULL;
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, NSPoint))objc_msgSend)(arg0, arg1, *lparg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSRect_2JD
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSRect_2JD)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3, jlong arg4, jdouble arg5)
{
	NSRect _arg2, *lparg2=NULL;
	NSRect _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSRect_2JD_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, NSRect, jlong, jdouble))objc_msgSend)(arg0, arg1, *lparg2, *lparg3, arg4, arg5);
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSRect_2JD_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSSize_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSSize_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3)
{
	NSRect _arg2, *lparg2=NULL;
	NSSize _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSSize_2_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSSizeFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, NSSize))objc_msgSend)(arg0, arg1, *lparg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSSizeFields(env, arg3, lparg3);
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_NSSize_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Z
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Z)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jboolean arg3)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Z_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jboolean))objc_msgSend)(arg0, arg1, *lparg2, arg3);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2Z_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2ZZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2ZZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jboolean arg3, jboolean arg4)
{
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2ZZ_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSRect, jboolean, jboolean))objc_msgSend)(arg0, arg1, *lparg2, arg3, arg4);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSRect_2ZZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSSize_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSSize_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2)
{
	NSSize _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSSize_2_FUNC);
	if (arg2) if ((lparg2 = getNSSizeFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, NSSize))objc_msgSend)(arg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSSizeFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJLorg_eclipse_swt_internal_cocoa_NSSize_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJZ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJZ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jboolean))objc_msgSend)(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJZJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJZJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2, jlong arg3)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJZJ_FUNC);
	rc = (jlong)((jlong (*)(jlong, jlong, jboolean, jlong))objc_msgSend)(arg0, arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJZJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJZLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJZLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2, jobject arg3)
{
	NSRect _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJZLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jboolean, NSRect))objc_msgSend)(arg0, arg1, arg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJZLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3B
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3B)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jbyteArray arg2)
{
	jbyte *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3B_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jbyte *))objc_msgSend)(arg0, arg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3B_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3BJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3BJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jbyteArray arg2, jlong arg3)
{
	jbyte *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3BJ_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jbyte *, jlong))objc_msgSend)(arg0, arg1, lparg2, arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3BJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3C
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3C)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jcharArray arg2)
{
	jchar *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3C_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetCharArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jchar *))objc_msgSend)(arg0, arg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseCharArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3C_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3CJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3CJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jcharArray arg2, jlong arg3)
{
	jchar *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3CJ_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetCharArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jchar *, jlong))objc_msgSend)(arg0, arg1, lparg2, arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseCharArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3CJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3CLorg_eclipse_swt_internal_cocoa_NSRange_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3CLorg_eclipse_swt_internal_cocoa_NSRange_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jcharArray arg2, jobject arg3)
{
	jchar *lparg2=NULL;
	NSRange _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3CLorg_eclipse_swt_internal_cocoa_NSRange_2_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetCharArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRangeFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jchar *, NSRange))objc_msgSend)(arg0, arg1, lparg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSRangeFields(env, arg3, lparg3);
	if (arg2 && lparg2) (*env)->ReleaseCharArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3CLorg_eclipse_swt_internal_cocoa_NSRange_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3D
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3D)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdoubleArray arg2)
{
	jdouble *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3D_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jdouble *))objc_msgSend)(arg0, arg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3D_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3DJD
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3DJD)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdoubleArray arg2, jlong arg3, jdouble arg4)
{
	jdouble *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3DJD_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jdouble *, jlong, jdouble))objc_msgSend)(arg0, arg1, lparg2, arg3, arg4);
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3DJD_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3I
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3I)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jintArray arg2)
{
	jint *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3I_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jint *))objc_msgSend)(arg0, arg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3I_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3IJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3IJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jintArray arg2, jlong arg3)
{
	jint *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3IJ_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jint *, jlong))objc_msgSend)(arg0, arg1, lparg2, arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3IJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3JII
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3JII)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2, jint arg3, jint arg4)
{
	jlong *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3JII_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong *, jint, jint))objc_msgSend)(arg0, arg1, lparg2, arg3, arg4);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3JII_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend__JJ_3JJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSend__JJ_3JJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2, jlong arg3, jlong arg4)
{
	jlong *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend__JJ_3JJJ_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(jlong, jlong, jlong *, jlong, jlong))objc_msgSend)(arg0, arg1, lparg2, arg3, arg4);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend__JJ_3JJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1)
{
	struct objc_super _arg0, *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2J_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong))objc_msgSendSuper)(lparg0, arg1);
fail:
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	struct objc_super _arg0, *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJ_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jlong))objc_msgSendSuper)(lparg0, arg1, arg2);
fail:
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3)
{
	struct objc_super _arg0, *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJ_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jlong, jlong))objc_msgSendSuper)(lparg0, arg1, arg2, arg3);
fail:
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJJJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5)
{
	struct objc_super _arg0, *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJJJ_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jlong, jlong, jlong, jlong))objc_msgSendSuper)(lparg0, arg1, arg2, arg3, arg4, arg5);
fail:
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJJZ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jboolean arg5)
{
	struct objc_super _arg0, *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJJZ_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jlong, jlong, jlong, jboolean))objc_msgSendSuper)(lparg0, arg1, arg2, arg3, arg4, arg5);
fail:
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJJJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jlong, NSPoint))objc_msgSendSuper)(lparg0, arg1, arg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSPoint _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jlong, NSPoint, jlong))objc_msgSendSuper)(lparg0, arg1, arg2, *lparg3, arg4);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSRect _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jlong, NSRect, jlong))objc_msgSendSuper)(lparg0, arg1, arg2, *lparg3, arg4);
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJZ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jboolean arg3)
{
	struct objc_super _arg0, *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJZ_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jlong, jboolean))objc_msgSendSuper)(lparg0, arg1, arg2, arg3);
fail:
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jobject arg2)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSPoint _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, NSPoint))objc_msgSendSuper)(lparg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jobject arg2)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, NSRect))objc_msgSendSuper)(lparg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jobject arg2, jlong arg3)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSRect _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, NSRect, jlong))objc_msgSendSuper)(lparg0, arg1, *lparg2, arg3);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSSize_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSSize_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jobject arg2)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSSize _arg2, *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSSize_2_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg2) if ((lparg2 = getNSSizeFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, NSSize))objc_msgSendSuper)(lparg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSSizeFields(env, arg2, lparg2);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSSize_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZ
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jboolean arg2)
{
	struct objc_super _arg0, *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZ_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jboolean))objc_msgSendSuper)(lparg0, arg1, arg2);
fail:
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT jlong JNICALL OS_NATIVE(objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jboolean arg2, jobject arg3)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSRect _arg3, *lparg3=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jlong)((jlong (*)(struct objc_super *, jlong, jboolean, NSRect))objc_msgSendSuper)(lparg0, arg1, arg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper_1bool__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSendSuper_1bool__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSPoint _arg3, *lparg3=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1bool__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jboolean)((jboolean (*)(struct objc_super *, jlong, jlong, NSPoint))objc_msgSendSuper_bool)(lparg0, arg1, arg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1bool__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper_1bool__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRange_2J
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSendSuper_1bool__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRange_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jobject arg2, jlong arg3)
{
	struct objc_super _arg0, *lparg0=NULL;
	NSRange _arg2, *lparg2=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1bool__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	if (arg0) if ((lparg0 = getobjc_superFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg2) if ((lparg2 = getNSRangeFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jboolean)((jboolean (*)(struct objc_super *, jlong, NSRange, jlong))objc_msgSendSuper_bool)(lparg0, arg1, *lparg2, arg3);
fail:
	if (arg2 && lparg2) setNSRangeFields(env, arg2, lparg2);
	if (arg0 && lparg0) setobjc_superFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1bool__Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1, jlong arg2, jlong arg3)
{
	NSRect _arg0, *lparg0=NULL;
	struct objc_super _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJ_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getobjc_superFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, struct objc_super *, jlong, jlong))objc_msgSendSuper_stret)(lparg0, lparg1, arg2, arg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(struct objc_super *, jlong, jlong))objc_msgSendSuper_stret)(lparg1, arg2, arg3);
	} else {
		*lparg0 = (*(NSRect (*)(struct objc_super *, jlong, jlong))objc_msgSendSuper)(lparg1, arg2, arg3);
	}
fail:
	if (arg1 && lparg1) setobjc_superFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1, jlong arg2, jlong arg3, jobject arg4, jlong arg5)
{
	NSRect _arg0, *lparg0=NULL;
	struct objc_super _arg1, *lparg1=NULL;
	NSRect _arg4, *lparg4=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getobjc_superFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (arg4) if ((lparg4 = getNSRectFields(env, arg4, &_arg4)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, struct objc_super *, jlong, jlong, NSRect, jlong))objc_msgSendSuper_stret)(lparg0, lparg1, arg2, arg3, *lparg4, arg5);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(struct objc_super *, jlong, jlong, NSRect, jlong))objc_msgSendSuper_stret)(lparg1, arg2, arg3, *lparg4, arg5);
	} else {
		*lparg0 = (*(NSRect (*)(struct objc_super *, jlong, jlong, NSRect, jlong))objc_msgSendSuper)(lparg1, arg2, arg3, *lparg4, arg5);
	}
fail:
	if (arg4 && lparg4) setNSRectFields(env, arg4, lparg4);
	if (arg1 && lparg1) setobjc_superFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1, jlong arg2, jobject arg3)
{
	NSRect _arg0, *lparg0=NULL;
	struct objc_super _arg1, *lparg1=NULL;
	NSRect _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getobjc_superFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, struct objc_super *, jlong, NSRect))objc_msgSendSuper_stret)(lparg0, lparg1, arg2, *lparg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(struct objc_super *, jlong, NSRect))objc_msgSendSuper_stret)(lparg1, arg2, *lparg3);
	} else {
		*lparg0 = (*(NSRect (*)(struct objc_super *, jlong, NSRect))objc_msgSendSuper)(lparg1, arg2, *lparg3);
	}
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg1 && lparg1) setobjc_superFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
}
#endif

#ifndef NO_objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1, jlong arg2, jobject arg3, jlong arg4)
{
	NSRect _arg0, *lparg0=NULL;
	struct objc_super _arg1, *lparg1=NULL;
	NSRect _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getobjc_superFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, struct objc_super *, jlong, NSRect, jlong))objc_msgSendSuper_stret)(lparg0, lparg1, arg2, *lparg3, arg4);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(struct objc_super *, jlong, NSRect, jlong))objc_msgSendSuper_stret)(lparg1, arg2, *lparg3, arg4);
	} else {
		*lparg0 = (*(NSRect (*)(struct objc_super *, jlong, NSRect, jlong))objc_msgSendSuper)(lparg1, arg2, *lparg3, arg4);
	}
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg1 && lparg1) setobjc_superFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2J)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1, jlong arg2)
{
	NSSize _arg0, *lparg0=NULL;
	struct objc_super _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2J_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getobjc_superFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, struct objc_super *, jlong))objc_msgSendSuper_stret)(lparg0, lparg1, arg2);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(struct objc_super *, jlong))objc_msgSendSuper_stret)(lparg1, arg2);
	} else {
		*lparg0 = (*(NSSize (*)(struct objc_super *, jlong))objc_msgSendSuper)(lparg1, arg2);
	}
fail:
	if (arg1 && lparg1) setobjc_superFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1, jlong arg2, jobject arg3)
{
	NSSize _arg0, *lparg0=NULL;
	struct objc_super _arg1, *lparg1=NULL;
	NSRect _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getobjc_superFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, struct objc_super *, jlong, NSRect))objc_msgSendSuper_stret)(lparg0, lparg1, arg2, *lparg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(struct objc_super *, jlong, NSRect))objc_msgSendSuper_stret)(lparg1, arg2, *lparg3);
	} else {
		*lparg0 = (*(NSSize (*)(struct objc_super *, jlong, NSRect))objc_msgSendSuper)(lparg1, arg2, *lparg3);
	}
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg1 && lparg1) setobjc_superFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
}
#endif

#ifndef NO_objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZ)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1, jlong arg2, jboolean arg3)
{
	NSSize _arg0, *lparg0=NULL;
	struct objc_super _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZ_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getobjc_superFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, struct objc_super *, jlong, jboolean))objc_msgSendSuper_stret)(lparg0, lparg1, arg2, arg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(struct objc_super *, jlong, jboolean))objc_msgSendSuper_stret)(lparg1, arg2, arg3);
	} else {
		*lparg0 = (*(NSSize (*)(struct objc_super *, jlong, jboolean))objc_msgSendSuper)(lparg1, arg2, arg3);
	}
fail:
	if (arg1 && lparg1) setobjc_superFields(env, arg1, lparg1);
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSendSuper_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2Lorg_eclipse_swt_internal_cocoa_objc_1super_2JZ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJ
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJ_FUNC);
	rc = (jboolean)((BOOL (*)(jlong, jlong))objc_msgSend_bool)(arg0, arg1);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJJ
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJJ_FUNC);
	rc = (jboolean)((BOOL (*)(jlong, jlong, jlong))objc_msgSend_bool)(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJJJ
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJJJ_FUNC);
	rc = (jboolean)((BOOL (*)(jlong, jlong, jlong, jlong))objc_msgSend_bool)(arg0, arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJJJJ
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJJJJ_FUNC);
	rc = (jboolean)((BOOL (*)(jlong, jlong, jlong, jlong, jlong))objc_msgSend_bool)(arg0, arg1, arg2, arg3, arg4);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJJJJJ
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJJJJJ_FUNC);
	rc = (jboolean)((BOOL (*)(jlong, jlong, jlong, jlong, jlong, jlong))objc_msgSend_bool)(arg0, arg1, arg2, arg3, arg4, arg5);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJJJJJJ
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJJJJJJ_FUNC);
	rc = (jboolean)((BOOL (*)(jlong, jlong, jlong, jlong, jlong, jlong, jlong))objc_msgSend_bool)(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3)
{
	NSPoint _arg3, *lparg3=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jboolean)((BOOL (*)(jlong, jlong, jlong, NSPoint))objc_msgSend_bool)(arg0, arg1, arg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJJLorg_eclipse_swt_internal_cocoa_NSSize_2Z
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJJLorg_eclipse_swt_internal_cocoa_NSSize_2Z)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3, jboolean arg4)
{
	NSSize _arg3, *lparg3=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJJLorg_eclipse_swt_internal_cocoa_NSSize_2Z_FUNC);
	if (arg3) if ((lparg3 = getNSSizeFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jboolean)((BOOL (*)(jlong, jlong, jlong, NSSize, jboolean))objc_msgSend_bool)(arg0, arg1, arg2, *lparg3, arg4);
fail:
	if (arg3 && lparg3) setNSSizeFields(env, arg3, lparg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJJLorg_eclipse_swt_internal_cocoa_NSSize_2Z_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2)
{
	NSPoint _arg2, *lparg2=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jboolean)((BOOL (*)(jlong, jlong, NSPoint))objc_msgSend_bool)(arg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3)
{
	NSPoint _arg2, *lparg2=NULL;
	NSRect _arg3, *lparg3=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg2) if ((lparg2 = getNSPointFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	rc = (jboolean)((BOOL (*)(jlong, jlong, NSPoint, NSRect))objc_msgSend_bool)(arg0, arg1, *lparg2, *lparg3);
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg2 && lparg2) setNSPointFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSPoint_2Lorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSRange_2J
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSRange_2J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3)
{
	NSRange _arg2, *lparg2=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	if (arg2) if ((lparg2 = getNSRangeFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jboolean)((BOOL (*)(jlong, jlong, NSRange, jlong))objc_msgSend_bool)(arg0, arg1, *lparg2, arg3);
fail:
	if (arg2 && lparg2) setNSRangeFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT jboolean JNICALL OS_NATIVE(objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2)
{
	NSRect _arg2, *lparg2=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg2) if ((lparg2 = getNSRectFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jboolean)((BOOL (*)(jlong, jlong, NSRect))objc_msgSend_bool)(arg0, arg1, *lparg2);
fail:
	if (arg2 && lparg2) setNSRectFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1bool__JJLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1floatret
JNIEXPORT jfloat JNICALL OS_NATIVE(objc_1msgSend_1floatret)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jfloat rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1floatret_FUNC);
	rc = (jfloat)((jfloat (*)(jlong, jlong))objc_msgSend_floatret)(arg0, arg1);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1floatret_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1fpret__JJ
JNIEXPORT jdouble JNICALL OS_NATIVE(objc_1msgSend_1fpret__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jdouble rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1fpret__JJ_FUNC);
	rc = (jdouble)((jdouble (*)(jlong, jlong))objc_msgSend_fpret)(arg0, arg1);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1fpret__JJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1fpret__JJJ
JNIEXPORT jdouble JNICALL OS_NATIVE(objc_1msgSend_1fpret__JJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jdouble rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1fpret__JJJ_FUNC);
	rc = (jdouble)((jdouble (*)(jlong, jlong, jlong))objc_msgSend_fpret)(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1fpret__JJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1fpret__JJJJ
JNIEXPORT jdouble JNICALL OS_NATIVE(objc_1msgSend_1fpret__JJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	jdouble rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1fpret__JJJJ_FUNC);
	rc = (jdouble)((jdouble (*)(jlong, jlong, jlong, jlong))objc_msgSend_fpret)(arg0, arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1fpret__JJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSAffineTransformStruct_2JJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSAffineTransformStruct_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSAffineTransformStruct _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSAffineTransformStruct_2JJ_FUNC);
	if (arg0) if ((lparg0 = getNSAffineTransformStructFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSAffineTransformStruct *, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSAffineTransformStruct (*)(jlong, jlong))objc_msgSend_stret)(arg1, arg2);
	} else {
		*lparg0 = (*(NSAffineTransformStruct (*)(jlong, jlong))objc_msgSend)(arg1, arg2);
	}
fail:
	if (arg0 && lparg0) setNSAffineTransformStructFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSAffineTransformStruct_2JJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSOperatingSystemVersion_2JJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSOperatingSystemVersion_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSOperatingSystemVersion _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSOperatingSystemVersion_2JJ_FUNC);
	if (arg0) if ((lparg0 = getNSOperatingSystemVersionFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSOperatingSystemVersion *, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSOperatingSystemVersion (*)(jlong, jlong))objc_msgSend_stret)(arg1, arg2);
	} else {
		*lparg0 = (*(NSOperatingSystemVersion (*)(jlong, jlong))objc_msgSend)(arg1, arg2);
	}
fail:
	if (arg0 && lparg0) setNSOperatingSystemVersionFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSOperatingSystemVersion_2JJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSPoint _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJ_FUNC);
	if (arg0) if ((lparg0 = getNSPointFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSPoint *, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSPoint (*)(jlong, jlong))objc_msgSend_stret)(arg1, arg2);
	} else {
		*lparg0 = (*(NSPoint (*)(jlong, jlong))objc_msgSend)(arg1, arg2);
	}
fail:
	if (arg0 && lparg0) setNSPointFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3)
{
	NSPoint _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJJ_FUNC);
	if (arg0) if ((lparg0 = getNSPointFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSPoint *, jlong, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, arg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSPoint (*)(jlong, jlong, jlong))objc_msgSend_stret)(arg1, arg2, arg3);
	} else {
		*lparg0 = (*(NSPoint (*)(jlong, jlong, jlong))objc_msgSend)(arg1, arg2, arg3);
	}
fail:
	if (arg0 && lparg0) setNSPointFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3)
{
	NSPoint _arg0, *lparg0=NULL;
	NSPoint _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
	if (arg0) if ((lparg0 = getNSPointFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSPoint *, jlong, jlong, NSPoint))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSPoint (*)(jlong, jlong, NSPoint))objc_msgSend_stret)(arg1, arg2, *lparg3);
	} else {
		*lparg0 = (*(NSPoint (*)(jlong, jlong, NSPoint))objc_msgSend)(arg1, arg2, *lparg3);
	}
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSPointFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	NSPoint _arg0, *lparg0=NULL;
	NSPoint _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
	if (arg0) if ((lparg0 = getNSPointFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSPointFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSPoint *, jlong, jlong, NSPoint, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3, arg4);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSPoint (*)(jlong, jlong, NSPoint, jlong))objc_msgSend_stret)(arg1, arg2, *lparg3, arg4);
	} else {
		*lparg0 = (*(NSPoint (*)(jlong, jlong, NSPoint, jlong))objc_msgSend)(arg1, arg2, *lparg3, arg4);
	}
fail:
	if (arg3 && lparg3) setNSPointFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSPointFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSPoint_2JJLorg_eclipse_swt_internal_cocoa_NSPoint_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSRange _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJ_FUNC);
	if (arg0) if ((lparg0 = getNSRangeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRange *, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRange (*)(jlong, jlong))objc_msgSend_stret)(arg1, arg2);
	} else {
		*lparg0 = (*(NSRange (*)(jlong, jlong))objc_msgSend)(arg1, arg2);
	}
fail:
	if (arg0 && lparg0) setNSRangeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3)
{
	NSRange _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJJ_FUNC);
	if (arg0) if ((lparg0 = getNSRangeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRange *, jlong, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, arg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRange (*)(jlong, jlong, jlong))objc_msgSend_stret)(arg1, arg2, arg3);
	} else {
		*lparg0 = (*(NSRange (*)(jlong, jlong, jlong))objc_msgSend)(arg1, arg2, arg3);
	}
fail:
	if (arg0 && lparg0) setNSRangeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJLorg_eclipse_swt_internal_cocoa_NSRange_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJLorg_eclipse_swt_internal_cocoa_NSRange_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	NSRange _arg0, *lparg0=NULL;
	NSRange _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	if (arg0) if ((lparg0 = getNSRangeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRangeFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRange *, jlong, jlong, NSRange, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3, arg4);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRange (*)(jlong, jlong, NSRange, jlong))objc_msgSend_stret)(arg1, arg2, *lparg3, arg4);
	} else {
		*lparg0 = (*(NSRange (*)(jlong, jlong, NSRange, jlong))objc_msgSend)(arg1, arg2, *lparg3, arg4);
	}
fail:
	if (arg3 && lparg3) setNSRangeFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSRangeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRange_2JJLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSRect _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJ_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong))objc_msgSend_stret)(arg1, arg2);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong))objc_msgSend)(arg1, arg2);
	}
fail:
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3)
{
	NSRect _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJ_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, arg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong, jlong))objc_msgSend_stret)(arg1, arg2, arg3);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong, jlong))objc_msgSend)(arg1, arg2, arg3);
	}
fail:
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4)
{
	NSRect _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJJ_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, arg3, arg4);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong, jlong, jlong))objc_msgSend_stret)(arg1, arg2, arg3, arg4);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong, jlong, jlong))objc_msgSend)(arg1, arg2, arg3, arg4);
	}
fail:
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJJZ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJJZ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jboolean arg5)
{
	NSRect _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJJZ_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong, jlong, jlong, jboolean))objc_msgSend_stret)(lparg0, arg1, arg2, arg3, arg4, arg5);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong, jlong, jlong, jboolean))objc_msgSend_stret)(arg1, arg2, arg3, arg4, arg5);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong, jlong, jlong, jboolean))objc_msgSend)(arg1, arg2, arg3, arg4, arg5);
	}
fail:
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJJZ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jlong arg3, jobject arg4, jlong arg5)
{
	NSRect _arg0, *lparg0=NULL;
	NSRect _arg4, *lparg4=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg4) if ((lparg4 = getNSRectFields(env, arg4, &_arg4)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong, jlong, NSRect, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, arg3, *lparg4, arg5);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong, jlong, NSRect, jlong))objc_msgSend_stret)(arg1, arg2, arg3, *lparg4, arg5);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong, jlong, NSRect, jlong))objc_msgSend)(arg1, arg2, arg3, *lparg4, arg5);
	}
fail:
	if (arg4 && lparg4) setNSRectFields(env, arg4, lparg4);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRange_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRange_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	NSRect _arg0, *lparg0=NULL;
	NSRange _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRangeFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong, NSRange, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3, arg4);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong, NSRange, jlong))objc_msgSend_stret)(arg1, arg2, *lparg3, arg4);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong, NSRange, jlong))objc_msgSend)(arg1, arg2, *lparg3, arg4);
	}
fail:
	if (arg3 && lparg3) setNSRangeFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRange_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3)
{
	NSRect _arg0, *lparg0=NULL;
	NSRect _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong, NSRect))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong, NSRect))objc_msgSend_stret)(arg1, arg2, *lparg3);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong, NSRect))objc_msgSend)(arg1, arg2, *lparg3);
	}
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	NSRect _arg0, *lparg0=NULL;
	NSRect _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong, NSRect, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3, arg4);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong, NSRect, jlong))objc_msgSend_stret)(arg1, arg2, *lparg3, arg4);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong, NSRect, jlong))objc_msgSend)(arg1, arg2, *lparg3, arg4);
	}
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2J
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4)
{
	NSRect _arg0, *lparg0=NULL;
	NSSize _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2J_FUNC);
	if (arg0) if ((lparg0 = getNSRectFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSSizeFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSRect *, jlong, jlong, NSSize, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3, arg4);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSRect (*)(jlong, jlong, NSSize, jlong))objc_msgSend_stret)(arg1, arg2, *lparg3, arg4);
	} else {
		*lparg0 = (*(NSRect (*)(jlong, jlong, NSSize, jlong))objc_msgSend)(arg1, arg2, *lparg3, arg4);
	}
fail:
	if (arg3 && lparg3) setNSSizeFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSRectFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSRect_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2J_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	NSSize _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJ_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(jlong, jlong))objc_msgSend_stret)(arg1, arg2);
	} else {
		*lparg0 = (*(NSSize (*)(jlong, jlong))objc_msgSend)(arg1, arg2);
	}
fail:
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3)
{
	NSSize _arg0, *lparg0=NULL;
	NSRect _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSRectFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, jlong, jlong, NSRect))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(jlong, jlong, NSRect))objc_msgSend_stret)(arg1, arg2, *lparg3);
	} else {
		*lparg0 = (*(NSSize (*)(jlong, jlong, NSRect))objc_msgSend)(arg1, arg2, *lparg3);
	}
fail:
	if (arg3 && lparg3) setNSRectFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSRect_2_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3)
{
	NSSize _arg0, *lparg0=NULL;
	NSSize _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSSizeFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, jlong, jlong, NSSize))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(jlong, jlong, NSSize))objc_msgSend_stret)(arg1, arg2, *lparg3);
	} else {
		*lparg0 = (*(NSSize (*)(jlong, jlong, NSSize))objc_msgSend)(arg1, arg2, *lparg3);
	}
fail:
	if (arg3 && lparg3) setNSSizeFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2JJJJJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2JJJJJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jlong arg4, jlong arg5, jlong arg6, jlong arg7, jlong arg8)
{
	NSSize _arg0, *lparg0=NULL;
	NSSize _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2JJJJJ_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSSizeFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, jlong, jlong, NSSize, jlong, jlong, jlong, jlong, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3, arg4, arg5, arg6, arg7, arg8);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(jlong, jlong, NSSize, jlong, jlong, jlong, jlong, jlong))objc_msgSend_stret)(arg1, arg2, *lparg3, arg4, arg5, arg6, arg7, arg8);
	} else {
		*lparg0 = (*(NSSize (*)(jlong, jlong, NSSize, jlong, jlong, jlong, jlong, jlong))objc_msgSend)(arg1, arg2, *lparg3, arg4, arg5, arg6, arg7, arg8);
	}
fail:
	if (arg3 && lparg3) setNSSizeFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2JJJJJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2ZZJ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2ZZJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jobject arg3, jboolean arg4, jboolean arg5, jlong arg6)
{
	NSSize _arg0, *lparg0=NULL;
	NSSize _arg3, *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2ZZJ_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getNSSizeFields(env, arg3, &_arg3)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, jlong, jlong, NSSize, jboolean, jboolean, jlong))objc_msgSend_stret)(lparg0, arg1, arg2, *lparg3, arg4, arg5, arg6);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(jlong, jlong, NSSize, jboolean, jboolean, jlong))objc_msgSend_stret)(arg1, arg2, *lparg3, arg4, arg5, arg6);
	} else {
		*lparg0 = (*(NSSize (*)(jlong, jlong, NSSize, jboolean, jboolean, jlong))objc_msgSend)(arg1, arg2, *lparg3, arg4, arg5, arg6);
	}
fail:
	if (arg3 && lparg3) setNSSizeFields(env, arg3, lparg3);
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJLorg_eclipse_swt_internal_cocoa_NSSize_2ZZJ_FUNC);
}
#endif

#ifndef NO_objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJZ
JNIEXPORT void JNICALL OS_NATIVE(objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJZ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2, jboolean arg3)
{
	NSSize _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJZ_FUNC);
	if (arg0) if ((lparg0 = getNSSizeFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (STRUCT_SIZE_LIMIT == 0) {
		((void (*)(NSSize *, jlong, jlong, jboolean))objc_msgSend_stret)(lparg0, arg1, arg2, arg3);
	} else if (sizeof(_arg0) > STRUCT_SIZE_LIMIT) {
		*lparg0 = (*(NSSize (*)(jlong, jlong, jboolean))objc_msgSend_stret)(arg1, arg2, arg3);
	} else {
		*lparg0 = (*(NSSize (*)(jlong, jlong, jboolean))objc_msgSend)(arg1, arg2, arg3);
	}
fail:
	if (arg0 && lparg0) setNSSizeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, objc_1msgSend_1stret__Lorg_eclipse_swt_internal_cocoa_NSSize_2JJZ_FUNC);
}
#endif

#ifndef NO_objc_1registerClassPair
JNIEXPORT void JNICALL OS_NATIVE(objc_1registerClassPair)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, objc_1registerClassPair_FUNC);
	objc_registerClassPair((Class)arg0);
	OS_NATIVE_EXIT(env, that, objc_1registerClassPair_FUNC);
}
#endif

#ifndef NO_objc_1super_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(objc_1super_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, objc_1super_1sizeof_FUNC);
	rc = (jint)objc_super_sizeof();
	OS_NATIVE_EXIT(env, that, objc_1super_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_object_1getClass
JNIEXPORT jlong JNICALL OS_NATIVE(object_1getClass)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, object_1getClass_FUNC);
	rc = (jlong)object_getClass((id)arg0);
	OS_NATIVE_EXIT(env, that, object_1getClass_FUNC);
	return rc;
}
#endif

#ifndef NO_object_1getClassName
JNIEXPORT jlong JNICALL OS_NATIVE(object_1getClassName)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, object_1getClassName_FUNC);
	rc = (jlong)object_getClassName((id)arg0);
	OS_NATIVE_EXIT(env, that, object_1getClassName_FUNC);
	return rc;
}
#endif

#ifndef NO_object_1getInstanceVariable
JNIEXPORT jlong JNICALL OS_NATIVE(object_1getInstanceVariable)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlongArray arg2)
{
	jbyte *lparg1=NULL;
	jlong *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, object_1getInstanceVariable_FUNC);
		if (arg1) if ((lparg1 = (*env)->GetPrimitiveArrayCritical(env, arg1, NULL)) == NULL) goto fail;
		if (arg2) if ((lparg2 = (*env)->GetPrimitiveArrayCritical(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)object_getInstanceVariable((id)arg0, (const char*)lparg1, (void **)lparg2);
fail:
		if (arg2 && lparg2) (*env)->ReleasePrimitiveArrayCritical(env, arg2, lparg2, 0);
		if (arg1 && lparg1) (*env)->ReleasePrimitiveArrayCritical(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, object_1getInstanceVariable_FUNC);
	return rc;
}
#endif

#ifndef NO_object_1setClass
JNIEXPORT jlong JNICALL OS_NATIVE(object_1setClass)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, object_1setClass_FUNC);
	rc = (jlong)object_setClass((id)arg0, (Class)arg1);
	OS_NATIVE_EXIT(env, that, object_1setClass_FUNC);
	return rc;
}
#endif

#ifndef NO_object_1setInstanceVariable
JNIEXPORT jlong JNICALL OS_NATIVE(object_1setInstanceVariable)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, object_1setInstanceVariable_FUNC);
		if (arg1) if ((lparg1 = (*env)->GetPrimitiveArrayCritical(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)object_setInstanceVariable((id)arg0, (const char*)lparg1, (void *)arg2);
fail:
		if (arg1 && lparg1) (*env)->ReleasePrimitiveArrayCritical(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, object_1setInstanceVariable_FUNC);
	return rc;
}
#endif

#ifndef NO_sel_1registerName
JNIEXPORT jlong JNICALL OS_NATIVE(sel_1registerName)
	(JNIEnv *env, jclass that, jstring arg0)
{
	const char *lparg0= NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, sel_1registerName_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetStringUTFChars(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)sel_registerName(lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseStringUTFChars(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, sel_1registerName_FUNC);
	return rc;
}
#endif

