// This file was generated by
//     //third_party/jni_zero/jni_zero.py
// For
//     org.jni_zero.JavapClass

#ifndef org_jni_1zero_JavapClass_JNI
#define org_jni_1zero_JavapClass_JNI

#include <jni.h>

#include "overridden/jni_zero_internal.h"
#include "extra_include.h"
#include "JavapClass_shared_jni.h"

// Field, class, and method accessors use inline functions with static
// variables for caching.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunique-object-duplication"

// Class Accessors
#ifndef java_lang_Runnable_clazz_defined
#define java_lang_Runnable_clazz_defined
inline jclass java_lang_Runnable_clazz(JNIEnv* env) {
  static const char kClassName[] = "java.lang.Runnable";
  static std::atomic<jclass> cached_class;
  return jni_zero::internal::LazyGetClass(env, kClassName, &cached_class);
}
#endif

#ifndef org_jni_1zero_JavapClass_clazz_defined
#define org_jni_1zero_JavapClass_clazz_defined
inline jclass org_jni_1zero_JavapClass_clazz(JNIEnv* env) {
  static const char kClassName[] = "org.jni_zero.JavapClass";
  static std::atomic<jclass> cached_class;
  return jni_zero::internal::LazyGetClass(env, kClassName, &cached_class);
}
#endif


// FieldId Accessors
inline jfieldID org_jni_1zero_JavapClass_fieldId_mMutableString(JNIEnv* env) {
  static std::atomic<jfieldID> cached_field_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  JNI_ZERO_DCHECK(clazz);
  ::jni_zero::internal::InitializeFieldID<::jni_zero::internal::FieldID::TYPE_INSTANCE>(env, clazz, "mMutableString", "Ljava/lang/String;", &cached_field_id);
  return cached_field_id.load(std::memory_order_relaxed);
}

inline jfieldID org_jni_1zero_JavapClass_fieldId_sMutableInt(JNIEnv* env) {
  static std::atomic<jfieldID> cached_field_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  JNI_ZERO_DCHECK(clazz);
  ::jni_zero::internal::InitializeFieldID<::jni_zero::internal::FieldID::TYPE_STATIC>(env, clazz, "sMutableInt", "Z", &cached_field_id);
  return cached_field_id.load(std::memory_order_relaxed);
}

inline jfieldID org_jni_1zero_JavapClass_fieldId_CONST_1STR(JNIEnv* env) {
  static std::atomic<jfieldID> cached_field_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  JNI_ZERO_DCHECK(clazz);
  ::jni_zero::internal::InitializeFieldID<::jni_zero::internal::FieldID::TYPE_STATIC>(env, clazz, "CONST_STR", "Ljava/lang/String;", &cached_field_id);
  return cached_field_id.load(std::memory_order_relaxed);
}


namespace JNI_JavapClass {

// Native to Java functions
[[maybe_unused]] static ::jni_zero::ScopedJavaLocalRef<jobject> Java_JavapClass_Constructor(
    JNIEnv* env) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz, nullptr);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "<init>",
      "()V",
      &cached_method_id);
  auto _ret = env->NewObject(clazz, call_context.method_id());
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

[[maybe_unused]] static ::jni_zero::ScopedJavaLocalRef<jobject> Java_JavapClass_Constructor__boolean(
    JNIEnv* env,
    bool p0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz, nullptr);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "<init>",
      "(Z)V",
      &cached_method_id);
  auto _ret = env->NewObject(clazz, call_context.method_id(), p0);
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

[[maybe_unused]] static ::jni_zero::ScopedJavaLocalRef<jobject> Java_JavapClass_Constructor__int(
    JNIEnv* env,
    JniIntWrapper p0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz, nullptr);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "<init>",
      "(I)V",
      &cached_method_id);
  auto _ret = env->NewObject(clazz, call_context.method_id(), as_jint(p0));
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

[[maybe_unused]] static int32_t Java_JavapClass_intMethod(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    const ::jni_zero::JavaRef<jstring>& p0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, obj.obj(), clazz, 0);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "intMethod",
      "(Ljava/lang/String;)I",
      &cached_method_id);
  auto _ret = env->CallIntMethod(obj.obj(), call_context.method_id(), p0.obj());
  return _ret;
}

[[maybe_unused]] static bool Java_JavapClass_nativeMethod(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    JniIntWrapper p0,
    const ::jni_zero::JavaRef<jstring>& p1) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, obj.obj(), clazz, false);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "nativeMethod",
      "(ILjava/lang/String;)Z",
      &cached_method_id);
  auto _ret = env->CallBooleanMethod(obj.obj(), call_context.method_id(), as_jint(p0), p1.obj());
  return _ret;
}

[[maybe_unused]] static ::jni_zero::ScopedJavaLocalRef<jclass> Java_JavapClass_objTest(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    const ::jni_zero::JavaRef<jobject>& p0,
    const ::jni_zero::JavaRef<jobjectArray>& p1) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, obj.obj(), clazz, nullptr);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "objTest",
      "(Ljava/lang/Object;[Ljava/lang/Runnable;)Ljava/lang/Class;",
      &cached_method_id);
  auto _ret = env->CallObjectMethod(obj.obj(), call_context.method_id(), p0.obj(), p1.obj());
  jclass _ret2 = static_cast<jclass>(_ret);
  return ::jni_zero::ScopedJavaLocalRef<jclass>::Adopt(env, _ret2);
}

[[maybe_unused]] static void Java_JavapClass_needsMangling__int(JNIEnv* env, JniIntWrapper p0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_STATIC>(
      env,
      clazz,
      "needsMangling",
      "(I)V",
      &cached_method_id);
  env->CallStaticVoidMethod(clazz, call_context.method_id(), as_jint(p0));
}

[[maybe_unused]] static void Java_JavapClass_needsMangling__String(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jstring>& p0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_STATIC>(
      env,
      clazz,
      "needsMangling",
      "(Ljava/lang/String;)V",
      &cached_method_id);
  env->CallStaticVoidMethod(clazz, call_context.method_id(), p0.obj());
}

[[maybe_unused]] static void Java_JavapClass_needsMangling__java_util_ArrayList(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& p0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_STATIC>(
      env,
      clazz,
      "needsMangling",
      "(Ljava/util/ArrayList;)V",
      &cached_method_id);
  env->CallStaticVoidMethod(clazz, call_context.method_id(), p0.obj());
}

[[maybe_unused]] static int32_t Java_JavapClass_staticIntMethod(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jstring>& p0,
    const ::jni_zero::JavaRef<jobject>& p1) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz, 0);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_STATIC>(
      env,
      clazz,
      "staticIntMethod",
      "(Ljava/lang/String;Lorg/jni_zero/JavapClass;)I",
      &cached_method_id);
  auto _ret = env->CallStaticIntMethod(clazz, call_context.method_id(), p0.obj(), p1.obj());
  return _ret;
}

[[maybe_unused]] static ::jni_zero::ScopedJavaLocalRef<jobjectArray> Java_JavapClass_staticIntMethod(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jstring>& p0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_JavapClass_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz, nullptr);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_STATIC>(
      env,
      clazz,
      "staticIntMethod",
      "(Ljava/lang/String;)[[I",
      &cached_method_id);
  auto _ret = env->CallStaticObjectMethod(clazz, call_context.method_id(), p0.obj());
  jobjectArray _ret2 = static_cast<jobjectArray>(_ret);
  return ::jni_zero::ScopedJavaLocalRef<jobjectArray>::Adopt(env, _ret2);
}



}  // namespace JNI_JavapClass

// jobject-subclass-aware definitions:
namespace jni_zero_internal {

using namespace ::JNI_JavapClass;

template<>
class _CalledByNativesStatics<::org::jni_zero::JJavapClass<jobject>> {
  public:
  static inline constexpr int32_t CONST_INT = 3;
  static inline constexpr char CONST_STR[] = "\"VaLuE\"";
  static inline constexpr bool sBoolValue = true;
  static bool Get_sMutableInt(JNIEnv* env) {
    jclass clazz = org_jni_1zero_JavapClass_clazz(env);
    JNI_ZERO_DCHECK(clazz);
    jfieldID field_id = org_jni_1zero_JavapClass_fieldId_sMutableInt(env);
    return env->GetStaticBooleanField(clazz, field_id);
  }
  static void Set_sMutableInt(JNIEnv* env, bool value) {
    jclass clazz = org_jni_1zero_JavapClass_clazz(env);
    JNI_ZERO_DCHECK(clazz);
    jfieldID field_id = org_jni_1zero_JavapClass_fieldId_sMutableInt(env);
    env->SetStaticBooleanField(clazz, field_id, value);
  }
  static int32_t Get_CONST_INT(JNIEnv* env) {
    return 3;
  }
  static ::jni_zero::ScopedJavaLocalRef<jstring> Get_CONST_STR(JNIEnv* env) {
    jclass clazz = org_jni_1zero_JavapClass_clazz(env);
    JNI_ZERO_DCHECK(clazz);
    jfieldID field_id = org_jni_1zero_JavapClass_fieldId_CONST_1STR(env);
    return ::jni_zero::ScopedJavaLocalRef<>::Adopt(env, env->GetStaticObjectField(clazz, field_id))
        .template As<jstring>();
  }
  static bool Get_sBoolValue(JNIEnv* env) {
    return true;
  }
  template <typename T>
  static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JJavapClass<T>> New(JNIEnv* env) {
    return Java_JavapClass_Constructor(env)
        .template As<::org::jni_zero::JJavapClass<T>>();
  }

  template <typename T>
  static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JJavapClass<T>> New(JNIEnv* env, bool p0) {
    return Java_JavapClass_Constructor__boolean(env, p0)
        .template As<::org::jni_zero::JJavapClass<T>>();
  }

  template <typename T>
  static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JJavapClass<T>> New(
      JNIEnv* env,
      JniIntWrapper p0) {
    return Java_JavapClass_Constructor__int(env, p0)
        .template As<::org::jni_zero::JJavapClass<T>>();
  }

  static void needsMangling(JNIEnv* env, JniIntWrapper p0) {
    Java_JavapClass_needsMangling__int(env, p0);
  }

  static void needsMangling(JNIEnv* env, const ::jni_zero::JavaRef<jstring>& p0) {
    Java_JavapClass_needsMangling__String(env, p0);
  }

  static void needsMangling(
      JNIEnv* env,
      const ::jni_zero::JavaRef<::java::util::JArrayList<jstring>>& p0) {
    Java_JavapClass_needsMangling__java_util_ArrayList(env, p0);
  }

  template <typename T>
  static int32_t staticIntMethod(
      JNIEnv* env,
      const ::jni_zero::JavaRef<jstring>& p0,
      const ::jni_zero::JavaRef<::org::jni_zero::JJavapClass<T>>& p1) {
    return Java_JavapClass_staticIntMethod(env, p0, p1);
  }

  static ::jni_zero::ScopedJavaLocalRef<JArray<JArray<int32_t>>> staticIntMethod(
      JNIEnv* env,
      const ::jni_zero::JavaRef<jstring>& p0) {
    return Java_JavapClass_staticIntMethod(env, p0)
        .template As<JArray<JArray<int32_t>>>();
  }

};

template <typename T>
class _CalledByNatives<::org::jni_zero::JJavapClass<T>> {
  public:
  static inline constexpr int32_t mFinalInt = 7;
  ::jni_zero::ScopedJavaLocalRef<jstring> Get_mMutableString(JNIEnv* env) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JJavapClass<T>>*>(this);
    jfieldID field_id = org_jni_1zero_JavapClass_fieldId_mMutableString(env);
    return ::jni_zero::ScopedJavaLocalRef<>::Adopt(env, env->GetObjectField(this_obj->obj(), field_id))
        .template As<jstring>();
  }
  void Set_mMutableString(JNIEnv* env, const ::jni_zero::JavaRef<jstring>& value) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JJavapClass<T>>*>(this);
    jfieldID field_id = org_jni_1zero_JavapClass_fieldId_mMutableString(env);
    env->SetObjectField(this_obj->obj(), field_id, value.obj());
  }
  int32_t Get_mFinalInt(JNIEnv* env) const {
    return 7;
  }
  int32_t intMethod(JNIEnv* env, const ::jni_zero::JavaRef<jstring>& p0) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JJavapClass<T>>*>(this);
    return Java_JavapClass_intMethod(env, *this_obj, p0);
  }

  bool nativeMethod(JNIEnv* env, JniIntWrapper p0, const ::jni_zero::JavaRef<jstring>& p1) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JJavapClass<T>>*>(this);
    return Java_JavapClass_nativeMethod(env, *this_obj, p0, p1);
  }

  template <typename T2>
  ::jni_zero::ScopedJavaLocalRef<jclass> objTest(
      JNIEnv* env,
      const ::jni_zero::JavaRef<T>& p0,
      const ::jni_zero::JavaRef<JArray<T2>>& p1) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JJavapClass<T>>*>(this);
    return Java_JavapClass_objTest(env, *this_obj, p0, p1);
  }

};


}  // namespace jni_zero_internal

namespace org::jni_zero {
using JavapClassJni = ::jni_zero_internal::_CalledByNativesStatics<::org::jni_zero::JJavapClass<jobject>>;
}
#ifndef _JNI_ZERO_JavapClassJni_DEFINED
#define _JNI_ZERO_JavapClassJni_DEFINED
using ::org::jni_zero::JavapClassJni;
#endif


#pragma clang diagnostic pop
#endif  // org_jni_1zero_JavapClass_JNI
