// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Autogenerated by jnigen. DO NOT EDIT!

#include <stdint.h>
#include "jni.h"
#include "dartjni.h"

thread_local JNIEnv *jniEnv;
JniContext jni;

JniContext (*context_getter)(void);
JNIEnv *(*env_getter)(void);

void setJniGetters(JniContext (*cg)(void),
        JNIEnv *(*eg)(void)) {
    context_getter = cg;
    env_getter = eg;
}

// com.example.notification_plugin.Notifications
jclass _c_com_example_notification_plugin_Notifications = NULL;

jmethodID _m_com_example_notification_plugin_Notifications_ctor = NULL;
FFI_PLUGIN_EXPORT
jobject com_example_notification_plugin_Notifications_ctor() {
    load_env();
    load_class_gr(&_c_com_example_notification_plugin_Notifications, "com/example/notification_plugin/Notifications");
    if (_c_com_example_notification_plugin_Notifications == NULL) return (jobject)0;
    load_method(_c_com_example_notification_plugin_Notifications, &_m_com_example_notification_plugin_Notifications_ctor, "<init>", "()V");
    if (_m_com_example_notification_plugin_Notifications_ctor == NULL) return (jobject)0;
    jobject _result = (*jniEnv)->NewObject(jniEnv, _c_com_example_notification_plugin_Notifications, _m_com_example_notification_plugin_Notifications_ctor);
    return to_global_ref(_result);
}

jmethodID _m_com_example_notification_plugin_Notifications_showNotification = NULL;
FFI_PLUGIN_EXPORT
void com_example_notification_plugin_Notifications_showNotification(jobject context, int32_t notificationID, jobject title, jobject text) {
    load_env();
    load_class_gr(&_c_com_example_notification_plugin_Notifications, "com/example/notification_plugin/Notifications");
    if (_c_com_example_notification_plugin_Notifications == NULL) return (void)0;
    load_static_method(_c_com_example_notification_plugin_Notifications, &_m_com_example_notification_plugin_Notifications_showNotification, "showNotification", "(Landroid/content/Context;ILjava/lang/String;Ljava/lang/String;)V");
    if (_m_com_example_notification_plugin_Notifications_showNotification == NULL) return (void)0;
    (*jniEnv)->CallStaticVoidMethod(jniEnv, _c_com_example_notification_plugin_Notifications, _m_com_example_notification_plugin_Notifications_showNotification, context, notificationID, title, text);
}

