/*******************************************************************************
 * Copyright (c) 2020 Equo
 *
 * 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:
 *    Guillermo Zunino, Equo - initial 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 "chromiumlib_structs.h"
#include "chromiumlib_stats.h"

#ifndef ChromiumLib_NATIVE
#define ChromiumLib_NATIVE(func) Java_org_eclipse_swt_internal_chromium_lib_ChromiumLib_##func
#endif

#ifndef NO_cef_1app_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1app_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1app_1t_1sizeof_FUNC);
	rc = (jint)cef_app_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1app_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1browser_1process_1handler_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1browser_1process_1handler_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1browser_1process_1handler_1t_1sizeof_FUNC);
	rc = (jint)cef_browser_process_handler_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1browser_1process_1handler_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1client_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1client_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1client_1t_1sizeof_FUNC);
	rc = (jint)cef_client_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1client_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1context_1menu_1handler_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1context_1menu_1handler_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1context_1menu_1handler_1t_1sizeof_FUNC);
	rc = (jint)cef_context_menu_handler_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1context_1menu_1handler_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1cookie_1visitor_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1cookie_1visitor_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1cookie_1visitor_1t_1sizeof_FUNC);
	rc = (jint)cef_cookie_visitor_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1cookie_1visitor_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1display_1handler_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1display_1handler_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1display_1handler_1t_1sizeof_FUNC);
	rc = (jint)cef_display_handler_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1display_1handler_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1focus_1handler_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1focus_1handler_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1focus_1handler_1t_1sizeof_FUNC);
	rc = (jint)cef_focus_handler_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1focus_1handler_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1jsdialog_1handler_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1jsdialog_1handler_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1jsdialog_1handler_1t_1sizeof_FUNC);
	rc = (jint)cef_jsdialog_handler_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1jsdialog_1handler_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1life_1span_1handler_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1life_1span_1handler_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1life_1span_1handler_1t_1sizeof_FUNC);
	rc = (jint)cef_life_span_handler_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1life_1span_1handler_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1load_1handler_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1load_1handler_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1load_1handler_1t_1sizeof_FUNC);
	rc = (jint)cef_load_handler_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1load_1handler_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1popup_1features_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1popup_1features_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1popup_1features_1t_1sizeof_FUNC);
	rc = (jint)cef_popup_features_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1popup_1features_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1request_1handler_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1request_1handler_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1request_1handler_1t_1sizeof_FUNC);
	rc = (jint)cef_request_handler_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1request_1handler_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cef_1string_1visitor_1t_1sizeof
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cef_1string_1visitor_1t_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cef_1string_1visitor_1t_1sizeof_FUNC);
	rc = (jint)cef_string_visitor_t_sizeof();
	ChromiumLib_NATIVE_EXIT(env, that, cef_1string_1visitor_1t_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1auth_1callback
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1auth_1callback)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1, jstring arg2, jint arg3)
{
	const char *lparg1= NULL;
	const char *lparg2= NULL;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1auth_1callback_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetStringUTFChars(env, arg2, NULL)) == NULL) goto fail;
	cefswt_auth_callback((void *)arg0, lparg1, lparg2, arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseStringUTFChars(env, arg2, lparg2);
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1auth_1callback_FUNC);
}
#endif

#ifndef NO_cefswt_1close_1browser
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1close_1browser)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1close_1browser_FUNC);
	cefswt_close_browser((void *)arg0, arg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1close_1browser_FUNC);
}
#endif

#ifndef NO_cefswt_1context_1menu_1cancel
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1context_1menu_1cancel)
	(JNIEnv *env, jclass that, jlong arg0)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1context_1menu_1cancel_FUNC);
	cefswt_context_menu_cancel((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1context_1menu_1cancel_FUNC);
}
#endif

#ifndef NO_cefswt_1create_1browser
JNIEXPORT jlong JNICALL ChromiumLib_NATIVE(cefswt_1create_1browser)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1, jlong arg2, jint arg3, jint arg4, jint arg5, jint arg6)
{
	const char *lparg1= NULL;
	jlong rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1create_1browser_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)cefswt_create_browser((void *)arg0, lparg1, (void *)arg2, arg3, arg4, arg5, arg6);
fail:
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1create_1browser_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1delete_1cookies
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1delete_1cookies)
	(JNIEnv *env, jclass that)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1delete_1cookies_FUNC);
	cefswt_delete_cookies();
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1delete_1cookies_FUNC);
}
#endif

#ifndef NO_cefswt_1dialog_1close
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1dialog_1close)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1dialog_1close_FUNC);
	cefswt_dialog_close((void *)arg0, arg1, (void *)arg2);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1dialog_1close_FUNC);
}
#endif

#ifndef NO_cefswt_1do_1message_1loop_1work
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cefswt_1do_1message_1loop_1work)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1do_1message_1loop_1work_FUNC);
	rc = (jint)cefswt_do_message_loop_work();
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1do_1message_1loop_1work_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1eval
JNIEXPORT jboolean JNICALL ChromiumLib_NATIVE(cefswt_1eval)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1, jint arg2, jlong arg3)
{
	const char *lparg1= NULL;
	jboolean rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1eval_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)cefswt_eval((void *)arg0, lparg1, arg2, (void *)arg3);
fail:
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1eval_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1execute
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1execute)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1)
{
	const char *lparg1= NULL;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1execute_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	cefswt_execute((void *)arg0, lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1execute_FUNC);
}
#endif

#ifndef NO_cefswt_1free
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1free_FUNC);
	cefswt_free((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1free_FUNC);
}
#endif

#ifndef NO_cefswt_1function
JNIEXPORT jboolean JNICALL ChromiumLib_NATIVE(cefswt_1function)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1, jint arg2)
{
	const char *lparg1= NULL;
	jboolean rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1function_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)cefswt_function((void *)arg0, lparg1, arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1function_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1function_1arg
JNIEXPORT jboolean JNICALL ChromiumLib_NATIVE(cefswt_1function_1arg)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2)
{
	jboolean rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1function_1arg_FUNC);
	rc = (jboolean)cefswt_function_arg((void *)arg0, arg1, (void *)arg2);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1function_1arg_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1function_1id
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1function_1id)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	FunctionSt _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1function_1id_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	cefswt_function_id((void *)arg0, lparg1);
fail:
	if (arg1 && lparg1) setFunctionStFields(env, arg1, lparg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1function_1id_FUNC);
}
#endif

#ifndef NO_cefswt_1function_1return
JNIEXPORT jboolean JNICALL ChromiumLib_NATIVE(cefswt_1function_1return)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jstring arg4)
{
	const char *lparg4= NULL;
	jboolean rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1function_1return_FUNC);
	if (arg4) if ((lparg4 = (*env)->GetStringUTFChars(env, arg4, NULL)) == NULL) goto fail;
	rc = (jboolean)cefswt_function_return((void *)arg0, arg1, arg2, arg3, lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseStringUTFChars(env, arg4, lparg4);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1function_1return_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1get_1cookie
JNIEXPORT jboolean JNICALL ChromiumLib_NATIVE(cefswt_1get_1cookie)
	(JNIEnv *env, jclass that, jstring arg0, jlong arg1)
{
	const char *lparg0= NULL;
	jboolean rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1get_1cookie_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetStringUTFChars(env, arg0, NULL)) == NULL) goto fail;
	rc = (jboolean)cefswt_get_cookie(lparg0, (void *)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseStringUTFChars(env, arg0, lparg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1get_1cookie_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1get_1id
JNIEXPORT jint JNICALL ChromiumLib_NATIVE(cefswt_1get_1id)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1get_1id_FUNC);
	rc = (jint)cefswt_get_id((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1get_1id_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1get_1text
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1get_1text)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1get_1text_FUNC);
	cefswt_get_text((void *)arg0, (void *)arg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1get_1text_FUNC);
}
#endif

#ifndef NO_cefswt_1get_1url
JNIEXPORT jlong JNICALL ChromiumLib_NATIVE(cefswt_1get_1url)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1get_1url_FUNC);
	rc = (jlong)cefswt_get_url((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1get_1url_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1go_1back
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1go_1back)
	(JNIEnv *env, jclass that, jlong arg0)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1go_1back_FUNC);
	cefswt_go_back((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1go_1back_FUNC);
}
#endif

#ifndef NO_cefswt_1go_1forward
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1go_1forward)
	(JNIEnv *env, jclass that, jlong arg0)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1go_1forward_FUNC);
	cefswt_go_forward((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1go_1forward_FUNC);
}
#endif

#ifndef NO_cefswt_1init
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1init)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1, jstring arg2, jstring arg3, jint arg4)
{
	const char *lparg1= NULL;
	const char *lparg2= NULL;
	const char *lparg3= NULL;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1init_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetStringUTFChars(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetStringUTFChars(env, arg3, NULL)) == NULL) goto fail;
	cefswt_init((void *)arg0, lparg1, lparg2, lparg3, arg4);
fail:
	if (arg3 && lparg3) (*env)->ReleaseStringUTFChars(env, arg3, lparg3);
	if (arg2 && lparg2) (*env)->ReleaseStringUTFChars(env, arg2, lparg2);
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1init_FUNC);
}
#endif

#ifndef NO_cefswt_1is_1main_1frame
JNIEXPORT jboolean JNICALL ChromiumLib_NATIVE(cefswt_1is_1main_1frame)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1is_1main_1frame_FUNC);
	rc = (jboolean)cefswt_is_main_frame((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1is_1main_1frame_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1is_1same
JNIEXPORT jboolean JNICALL ChromiumLib_NATIVE(cefswt_1is_1same)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1is_1same_FUNC);
	rc = (jboolean)cefswt_is_same((void *)arg0, (void *)arg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1is_1same_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1load_1url
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1load_1url)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1, jbyteArray arg2, jint arg3, jstring arg4, jint arg5)
{
	const char *lparg1= NULL;
	jbyte *lparg2=NULL;
	const char *lparg4= NULL;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1load_1url_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetStringUTFChars(env, arg4, NULL)) == NULL) goto fail;
	cefswt_load_url((void *)arg0, lparg1, lparg2, arg3, lparg4, arg5);
fail:
	if (arg4 && lparg4) (*env)->ReleaseStringUTFChars(env, arg4, lparg4);
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1load_1url_FUNC);
}
#endif

#ifndef NO_cefswt_1reload
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1reload)
	(JNIEnv *env, jclass that, jlong arg0)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1reload_FUNC);
	cefswt_reload((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1reload_FUNC);
}
#endif

#ifndef NO_cefswt_1resized
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1resized)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1resized_FUNC);
	cefswt_resized((void *)arg0, arg1, arg2);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1resized_FUNC);
}
#endif

#ifndef NO_cefswt_1set_1cookie
JNIEXPORT jboolean JNICALL ChromiumLib_NATIVE(cefswt_1set_1cookie)
	(JNIEnv *env, jclass that, jstring arg0, jstring arg1, jstring arg2, jstring arg3, jstring arg4, jint arg5, jint arg6, jdouble arg7)
{
	const char *lparg0= NULL;
	const char *lparg1= NULL;
	const char *lparg2= NULL;
	const char *lparg3= NULL;
	const char *lparg4= NULL;
	jboolean rc = 0;
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1set_1cookie_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetStringUTFChars(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetStringUTFChars(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetStringUTFChars(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetStringUTFChars(env, arg4, NULL)) == NULL) goto fail;
	rc = (jboolean)cefswt_set_cookie(lparg0, lparg1, lparg2, lparg3, lparg4, arg5, arg6, arg7);
fail:
	if (arg4 && lparg4) (*env)->ReleaseStringUTFChars(env, arg4, lparg4);
	if (arg3 && lparg3) (*env)->ReleaseStringUTFChars(env, arg3, lparg3);
	if (arg2 && lparg2) (*env)->ReleaseStringUTFChars(env, arg2, lparg2);
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	if (arg0 && lparg0) (*env)->ReleaseStringUTFChars(env, arg0, lparg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1set_1cookie_FUNC);
	return rc;
}
#endif

#ifndef NO_cefswt_1set_1focus
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1set_1focus)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1, jlong arg2)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1set_1focus_FUNC);
	cefswt_set_focus((void *)arg0, arg1, (void *)arg2);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1set_1focus_FUNC);
}
#endif

#ifndef NO_cefswt_1set_1window_1info_1parent
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1set_1window_1info_1parent)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jint arg4, jint arg5, jint arg6, jint arg7)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1set_1window_1info_1parent_FUNC);
	cefswt_set_window_info_parent((void *)arg0, (void *)arg1, (void *)arg2, (void *)arg3, arg4, arg5, arg6, arg7);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1set_1window_1info_1parent_FUNC);
}
#endif

#ifndef NO_cefswt_1shutdown
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1shutdown)
	(JNIEnv *env, jclass that)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1shutdown_FUNC);
	cefswt_shutdown();
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1shutdown_FUNC);
}
#endif

#ifndef NO_cefswt_1stop
JNIEXPORT void JNICALL ChromiumLib_NATIVE(cefswt_1stop)
	(JNIEnv *env, jclass that, jlong arg0)
{
	ChromiumLib_NATIVE_ENTER(env, that, cefswt_1stop_FUNC);
	cefswt_stop((void *)arg0);
	ChromiumLib_NATIVE_EXIT(env, that, cefswt_1stop_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1app_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1app_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_app_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1app_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_app_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1app_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1browser_1process_1handler_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1browser_1process_1handler_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_browser_process_handler_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1browser_1process_1handler_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_browser_process_handler_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1browser_1process_1handler_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1client_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1client_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_client_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1client_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_client_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1client_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1context_1menu_1handler_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1context_1menu_1handler_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_context_menu_handler_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1context_1menu_1handler_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_context_menu_handler_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1context_1menu_1handler_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1cookie_1visitor_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1cookie_1visitor_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_cookie_visitor_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1cookie_1visitor_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_cookie_visitor_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1cookie_1visitor_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1display_1handler_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1display_1handler_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_display_handler_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1display_1handler_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_display_handler_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1display_1handler_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1focus_1handler_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1focus_1handler_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_focus_handler_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1focus_1handler_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_focus_handler_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1focus_1handler_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1jsdialog_1handler_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1jsdialog_1handler_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_jsdialog_handler_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1jsdialog_1handler_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_jsdialog_handler_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1jsdialog_1handler_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1life_1span_1handler_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1life_1span_1handler_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_life_span_handler_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1life_1span_1handler_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_life_span_handler_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1life_1span_1handler_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1load_1handler_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1load_1handler_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_load_handler_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1load_1handler_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_load_handler_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1load_1handler_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1request_1handler_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1request_1handler_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_request_handler_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1request_1handler_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_request_handler_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1request_1handler_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1string_1visitor_1t_2I
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1string_1visitor_1t_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	cef_string_visitor_t _arg1, *lparg1=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1string_1visitor_1t_2I_FUNC);
	if (arg1) if ((lparg1 = getcef_string_visitor_tFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	ChromiumLib_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_chromium_lib_cef_1string_1visitor_1t_2I_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_chromium_lib_cef_1popup_1features_1t_2JI
JNIEXPORT void JNICALL ChromiumLib_NATIVE(memmove__Lorg_eclipse_swt_internal_chromium_lib_cef_1popup_1features_1t_2JI)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jint arg2)
{
	cef_popup_features_t _arg0, *lparg0=NULL;
	ChromiumLib_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_chromium_lib_cef_1popup_1features_1t_2JI_FUNC);
	if (arg0) if ((lparg0 = getcef_popup_features_tFields(env, arg0, &_arg0)) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setcef_popup_features_tFields(env, arg0, lparg0);
	ChromiumLib_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_chromium_lib_cef_1popup_1features_1t_2JI_FUNC);
}
#endif

