// This file was generated by
//     //third_party/jni_zero/jni_zero.py
// For
//     this.is.a.package.prefix.org.jni_zero.SampleForTests

#ifndef this_is_a_package_prefix_org_jni_1zero_SampleForTests_JNI
#define this_is_a_package_prefix_org_jni_1zero_SampleForTests_JNI

#include <jni.h>

#include "overridden/jni_zero_internal.h"
#include "extra_include.h"
#include "SampleForTests_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"

// Example signatures (to be implemented by #including file).
// * JNIEnv* parameters are optional.
// * Types do not have to be exact; they must accept rvalues of the examples.
//
// void CPPClass::AddStructB(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& caller,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests_InnerStructB>& b);
//
// static void JNI_SampleForTests_ClassUnderSamePackageTest(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleUnderSamePackage>& arg);
//
// void CPPClass::Destroy(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& caller,
//     const std::vector<uint8_t>& bytes);
//
// static jni_zero::ScopedJavaLocalRef<jclass> JNI_SampleForTests_GetClass(
//     JNIEnv* env,
//     const jni_zero::JavaRef<jclass>& _env);
//
// static double JNI_SampleForTests_GetDoubleFunction(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& ret);
//
// static float JNI_SampleForTests_GetFloatFunction(JNIEnv* env);
//
// static jni_zero::ScopedJavaLocalRef<jobject> JNI_SampleForTests_GetNonPODDatatype(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& _jcaller);
//
// static jni_zero::ScopedJavaLocalRef<jthrowable> JNI_SampleForTests_GetThrowable(
//     JNIEnv* env,
//     const jni_zero::JavaRef<jthrowable>& arg0);
//
// static int64_t JNI_SampleForTests_Init(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& caller,
//     const jni_zero::JavaRef<jstring>& param,
//     const jni_zero::JavaRef<JArray<int8_t>>& bytes,
//     jni_zero::tests::CPPClass* convertedType,
//     const std::vector<jni_zero::ScopedJavaLocalRef<jobject>>& nonConvertedArray);
//
// void CPPClass::IterateAndDoSomethingWithStructB(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& caller);
//
// static std::vector<jni_zero::ScopedJavaLocalRef<jobject>> JNI_SampleForTests_ListTest2(
//     JNIEnv* env,
//     const std::vector<std::string>& items);
//
// static std::map<std::string, std::string> JNI_SampleForTests_MapTest2(
//     JNIEnv* env,
//     const std::map<std::string, std::string>& arg0);
//
// int32_t CPPClass::Method(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& caller,
//     const std::vector<std::string>& strings);
//
// double CPPClass::InnerClass::MethodOtherP0(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& caller);
//
// static std::vector<bool> JNI_SampleForTests_PrimitiveArrays(
//     JNIEnv* env,
//     const std::vector<uint8_t>& b,
//     const std::vector<uint16_t>& c,
//     const std::vector<int16_t>& s,
//     const std::vector<int32_t>& i,
//     const std::vector<int64_t>& l,
//     const std::vector<float>& f,
//     const std::vector<double>& d);
//
// jni_zero::ScopedJavaLocalRef<jstring> CPPClass::ReturnAString(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& caller);
//
// static MyEnum JNI_SampleForTests_ReturnFromEnum(JNIEnv* env);
//
// static void JNI_SampleForTests_SetNonPODDatatype(
//     JNIEnv* env,
//     const jni_zero::JavaRef<::org::jni_zero::JSampleForTests>& obj,
//     const jni_zero::JavaRef<::android::graphics::JRect>& rect);
//

// Triggers a compiler warning if DEFINE_JNI(SampleForTests) is forgotten (requires -Wunused-function).
static void YouForgotToCallMacro_DEFINE_JNI_SampleForTests() {}

// Java to native functions
#define DEFINE_JNI_FOR_SampleForTests()                                                            \
  namespace {                                                                                      \
                                                                                                   \
  using namespace jni_zero::tests;                                                                 \
  JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1addStructB( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      int64_t nativeCPPClass,                                                                      \
      jobject caller,                                                                              \
      jobject b) {                                                                                 \
    /* Prevent -Wunused-function warning. */                                                       \
    YouForgotToCallMacro_DEFINE_JNI_SampleForTests();                                              \
                                                                                                   \
    auto caller_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,        \
        static_cast<::org::jni_zero::JSampleForTests>(caller));                                    \
    auto b_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests_InnerStructB>::CreateLeaky(env, \
        static_cast<::org::jni_zero::JSampleForTests_InnerStructB>(b));                            \
    CPPClass* _ptr = reinterpret_cast<CPPClass*>(nativeCPPClass);                                  \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(_ptr->AddStructB(std::forward<decltype(args)>(args)...)) {                          \
        return _ptr->AddStructB(std::forward<decltype(args)>(args)...);                            \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, caller_ref, b_ref); }) {                          \
        return func_wrapper(env, caller_ref, b_ref);                                               \
      } else if constexpr (requires { func_wrapper(caller_ref, b_ref); }) {                        \
        return func_wrapper(caller_ref, b_ref);                                                    \
      } else {                                                                                     \
        static_assert(false, "CPPClass::AddStructB() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&, const jni_zero::JavaRef<JSampleForTests_InnerStructB>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    dependent_context(0);                                                                          \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1classUnderSamePackageTest( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject arg) {                                                                               \
    auto arg_ref = jni_zero::JavaRef<::org::jni_zero::JSampleUnderSamePackage>::CreateLeaky(env,   \
        static_cast<::org::jni_zero::JSampleUnderSamePackage>(arg));                               \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_ClassUnderSamePackageTest(std::forward<decltype(args)>(args)...)) { \
        return JNI_SampleForTests_ClassUnderSamePackageTest(std::forward<decltype(args)>(args)...); \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, arg_ref); }) {                                    \
        return func_wrapper(env, arg_ref);                                                         \
      } else if constexpr (requires { func_wrapper(arg_ref); }) {                                  \
        return func_wrapper(arg_ref);                                                              \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_ClassUnderSamePackageTest() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleUnderSamePackage>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    dependent_context(0);                                                                          \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1destroy( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      int64_t nativeCPPClass,                                                                      \
      jobject caller,                                                                              \
      jobject bytes) {                                                                             \
    auto caller_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,        \
        static_cast<::org::jni_zero::JSampleForTests>(caller));                                    \
    std::vector<uint8_t> bytes_converted = jni_zero::FromJniArray<std::vector<uint8_t>>(           \
        env,                                                                                       \
        jni_zero::JavaRef<jbyteArray>::CreateLeaky(env, static_cast<jbyteArray>(bytes)));          \
    CPPClass* _ptr = reinterpret_cast<CPPClass*>(nativeCPPClass);                                  \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(_ptr->Destroy(std::forward<decltype(args)>(args)...)) {                             \
        return _ptr->Destroy(std::forward<decltype(args)>(args)...);                               \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, caller_ref, std::move(bytes_converted)); }) {     \
        return func_wrapper(env, caller_ref, std::move(bytes_converted));                          \
      } else if constexpr (requires { func_wrapper(caller_ref, std::move(bytes_converted)); }) {   \
        return func_wrapper(caller_ref, std::move(bytes_converted));                               \
      } else {                                                                                     \
        static_assert(false, "CPPClass::Destroy() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&, std::vector<uint8_t>)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    dependent_context(0);                                                                          \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1getClass( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject _env) {                                                                              \
    auto env_ref = jni_zero::JavaRef<jclass>::CreateLeaky(env,                                     \
        static_cast<jclass>(_env));                                                                \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_GetClass(std::forward<decltype(args)>(args)...)) {               \
        return JNI_SampleForTests_GetClass(std::forward<decltype(args)>(args)...);                 \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, env_ref); }) {                                    \
        return func_wrapper(env, env_ref);                                                         \
      } else if constexpr (requires { func_wrapper(env_ref); }) {                                  \
        return func_wrapper(env_ref);                                                              \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_GetClass() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<jclass>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value.ReleaseLocal();                                                            \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT double Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1getDoubleFunction( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject ret) {                                                                               \
    auto ret_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,           \
        static_cast<::org::jni_zero::JSampleForTests>(ret));                                       \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_GetDoubleFunction(std::forward<decltype(args)>(args)...)) {      \
        return JNI_SampleForTests_GetDoubleFunction(std::forward<decltype(args)>(args)...);        \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, ret_ref); }) {                                    \
        return func_wrapper(env, ret_ref);                                                         \
      } else if constexpr (requires { func_wrapper(ret_ref); }) {                                  \
        return func_wrapper(ret_ref);                                                              \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_GetDoubleFunction() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value;                                                                           \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT float Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1getFloatFunction( \
      JNIEnv* env,                                                                                 \
      jclass jcaller) {                                                                            \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_GetFloatFunction(std::forward<decltype(args)>(args)...)) {       \
        return JNI_SampleForTests_GetFloatFunction(std::forward<decltype(args)>(args)...);         \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env); }) {                                             \
        return func_wrapper(env);                                                                  \
      } else if constexpr (requires { func_wrapper(); }) {                                         \
        return func_wrapper();                                                                     \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_GetFloatFunction() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: ()\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value;                                                                           \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1getNonPODDatatype( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject _jcaller) {                                                                          \
    auto jcaller_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,       \
        static_cast<::org::jni_zero::JSampleForTests>(_jcaller));                                  \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_GetNonPODDatatype(std::forward<decltype(args)>(args)...)) {      \
        return JNI_SampleForTests_GetNonPODDatatype(std::forward<decltype(args)>(args)...);        \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, jcaller_ref); }) {                                \
        return func_wrapper(env, jcaller_ref);                                                     \
      } else if constexpr (requires { func_wrapper(jcaller_ref); }) {                              \
        return func_wrapper(jcaller_ref);                                                          \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_GetNonPODDatatype() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value.ReleaseLocal();                                                            \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1getThrowable( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject arg0) {                                                                              \
    auto arg0_ref = jni_zero::JavaRef<jthrowable>::CreateLeaky(env,                                \
        static_cast<jthrowable>(arg0));                                                            \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_GetThrowable(std::forward<decltype(args)>(args)...)) {           \
        return JNI_SampleForTests_GetThrowable(std::forward<decltype(args)>(args)...);             \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, arg0_ref); }) {                                   \
        return func_wrapper(env, arg0_ref);                                                        \
      } else if constexpr (requires { func_wrapper(arg0_ref); }) {                                 \
        return func_wrapper(arg0_ref);                                                             \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_GetThrowable() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<jthrowable>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value.ReleaseLocal();                                                            \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT int64_t Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1init( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject caller,                                                                              \
      jobject param,                                                                               \
      jobject bytes,                                                                               \
      jobject convertedType,                                                                       \
      jobject nonConvertedArray) {                                                                 \
    auto caller_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,        \
        static_cast<::org::jni_zero::JSampleForTests>(caller));                                    \
    auto param_ref = jni_zero::JavaRef<jstring>::CreateLeaky(env,                                  \
        static_cast<jstring>(param));                                                              \
    auto bytes_ref = jni_zero::JavaRef<JArray<int8_t>>::CreateLeaky(env,                           \
        static_cast<JArray<int8_t>>(bytes));                                                       \
    jni_zero::tests::CPPClass* convertedType_converted = jni_zero::FromJniType<jni_zero::tests::CPPClass*>( \
        env,                                                                                       \
        jni_zero::JavaRef<jobject>::CreateLeaky(env, convertedType));                              \
    std::vector<jni_zero::ScopedJavaLocalRef<jobject>> nonConvertedArray_converted = jni_zero::FromJniArray<std::vector<jni_zero::ScopedJavaLocalRef<jobject>>>( \
        env,                                                                                       \
        jni_zero::JavaRef<jobjectArray>::CreateLeaky(env, static_cast<jobjectArray>(nonConvertedArray))); \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_Init(std::forward<decltype(args)>(args)...)) {                   \
        return JNI_SampleForTests_Init(std::forward<decltype(args)>(args)...);                     \
      };                                                                                           \
      if constexpr (requires { func_wrapper(                                                       \
          env,                                                                                     \
          caller_ref,                                                                              \
          param_ref,                                                                               \
          bytes_ref,                                                                               \
          std::move(convertedType_converted),                                                      \
          std::move(nonConvertedArray_converted)); }) {                                            \
        return func_wrapper(                                                                       \
            env,                                                                                   \
            caller_ref,                                                                            \
            param_ref,                                                                             \
            bytes_ref,                                                                             \
            std::move(convertedType_converted),                                                    \
            std::move(nonConvertedArray_converted));                                               \
      } else if constexpr (requires { func_wrapper(                                                \
          caller_ref,                                                                              \
          param_ref,                                                                               \
          bytes_ref,                                                                               \
          std::move(convertedType_converted),                                                      \
          std::move(nonConvertedArray_converted)); }) {                                            \
        return func_wrapper(                                                                       \
            caller_ref,                                                                            \
            param_ref,                                                                             \
            bytes_ref,                                                                             \
            std::move(convertedType_converted),                                                    \
            std::move(nonConvertedArray_converted));                                               \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_Init() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&, const jni_zero::JavaRef<jstring>&, const jni_zero::JavaRef<JArray<int8_t>>&, jni_zero::tests::CPPClass*, std::vector<jni_zero::ScopedJavaLocalRef<jobject>>)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value;                                                                           \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1iterateAndDoSomethingWithStructB( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      int64_t nativeCPPClass,                                                                      \
      jobject caller) {                                                                            \
    auto caller_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,        \
        static_cast<::org::jni_zero::JSampleForTests>(caller));                                    \
    CPPClass* _ptr = reinterpret_cast<CPPClass*>(nativeCPPClass);                                  \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(_ptr->IterateAndDoSomethingWithStructB(std::forward<decltype(args)>(args)...)) {    \
        return _ptr->IterateAndDoSomethingWithStructB(std::forward<decltype(args)>(args)...);      \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, caller_ref); }) {                                 \
        return func_wrapper(env, caller_ref);                                                      \
      } else if constexpr (requires { func_wrapper(caller_ref); }) {                               \
        return func_wrapper(caller_ref);                                                           \
      } else {                                                                                     \
        static_assert(false, "CPPClass::IterateAndDoSomethingWithStructB() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    dependent_context(0);                                                                          \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1listTest2( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject items) {                                                                             \
    std::vector<std::string> items_converted = jni_zero::FromJniCollection<std::vector<std::string>>( \
        env,                                                                                       \
        jni_zero::JavaRef<jobject>::CreateLeaky(env, items));                                      \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_ListTest2(std::forward<decltype(args)>(args)...)) {              \
        return JNI_SampleForTests_ListTest2(std::forward<decltype(args)>(args)...);                \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, std::move(items_converted)); }) {                 \
        return func_wrapper(env, std::move(items_converted));                                      \
      } else if constexpr (requires { func_wrapper(std::move(items_converted)); }) {               \
        return func_wrapper(std::move(items_converted));                                           \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_ListTest2() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (std::vector<std::string>)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    auto converted_ret = jni_zero::ToJniList(env, std::move(return_value)).Release();              \
    return converted_ret;                                                                          \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1mapTest2( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject arg0) {                                                                              \
    std::map<std::string, std::string> arg0_converted = jni_zero::FromJniType<std::map<std::string, std::string>>( \
        env,                                                                                       \
        jni_zero::JavaRef<jobject>::CreateLeaky(env, arg0));                                       \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_MapTest2(std::forward<decltype(args)>(args)...)) {               \
        return JNI_SampleForTests_MapTest2(std::forward<decltype(args)>(args)...);                 \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, std::move(arg0_converted)); }) {                  \
        return func_wrapper(env, std::move(arg0_converted));                                       \
      } else if constexpr (requires { func_wrapper(std::move(arg0_converted)); }) {                \
        return func_wrapper(std::move(arg0_converted));                                            \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_MapTest2() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (std::map<std::string, std::string>)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    auto converted_ret = jni_zero::ToJniType(env, std::move(return_value)).Release();              \
    return converted_ret;                                                                          \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT int32_t Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1method( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      int64_t nativeCPPClass,                                                                      \
      jobject caller,                                                                              \
      jobject strings) {                                                                           \
    auto caller_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,        \
        static_cast<::org::jni_zero::JSampleForTests>(caller));                                    \
    std::vector<std::string> strings_converted = jni_zero::FromJniArray<std::vector<std::string>>( \
        env,                                                                                       \
        jni_zero::JavaRef<jobjectArray>::CreateLeaky(env, static_cast<jobjectArray>(strings)));    \
    CPPClass* _ptr = reinterpret_cast<CPPClass*>(nativeCPPClass);                                  \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(_ptr->Method(std::forward<decltype(args)>(args)...)) {                              \
        return _ptr->Method(std::forward<decltype(args)>(args)...);                                \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, caller_ref, std::move(strings_converted)); }) {   \
        return func_wrapper(env, caller_ref, std::move(strings_converted));                        \
      } else if constexpr (requires { func_wrapper(caller_ref, std::move(strings_converted)); }) { \
        return func_wrapper(caller_ref, std::move(strings_converted));                             \
      } else {                                                                                     \
        static_assert(false, "CPPClass::Method() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&, std::vector<std::string>)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value;                                                                           \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT double Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1methodOtherP0( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      int64_t nativePtr,                                                                           \
      jobject caller) {                                                                            \
    auto caller_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,        \
        static_cast<::org::jni_zero::JSampleForTests>(caller));                                    \
    CPPClass::InnerClass* _ptr = reinterpret_cast<CPPClass::InnerClass*>(nativePtr);               \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(_ptr->MethodOtherP0(std::forward<decltype(args)>(args)...)) {                       \
        return _ptr->MethodOtherP0(std::forward<decltype(args)>(args)...);                         \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, caller_ref); }) {                                 \
        return func_wrapper(env, caller_ref);                                                      \
      } else if constexpr (requires { func_wrapper(caller_ref); }) {                               \
        return func_wrapper(caller_ref);                                                           \
      } else {                                                                                     \
        static_assert(false, "CPPClass::InnerClass::MethodOtherP0() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value;                                                                           \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1primitiveArrays( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject b,                                                                                   \
      jobject c,                                                                                   \
      jobject s,                                                                                   \
      jobject i,                                                                                   \
      jobject l,                                                                                   \
      jobject f,                                                                                   \
      jobject d) {                                                                                 \
    std::vector<uint8_t> b_converted = jni_zero::FromJniArray<std::vector<uint8_t>>(               \
        env,                                                                                       \
        jni_zero::JavaRef<jbyteArray>::CreateLeaky(env, static_cast<jbyteArray>(b)));              \
    std::vector<uint16_t> c_converted = jni_zero::FromJniArray<std::vector<uint16_t>>(             \
        env,                                                                                       \
        jni_zero::JavaRef<jcharArray>::CreateLeaky(env, static_cast<jcharArray>(c)));              \
    std::vector<int16_t> s_converted = jni_zero::FromJniArray<std::vector<int16_t>>(               \
        env,                                                                                       \
        jni_zero::JavaRef<jshortArray>::CreateLeaky(env, static_cast<jshortArray>(s)));            \
    std::vector<int32_t> i_converted = jni_zero::FromJniArray<std::vector<int32_t>>(               \
        env,                                                                                       \
        jni_zero::JavaRef<jintArray>::CreateLeaky(env, static_cast<jintArray>(i)));                \
    std::vector<int64_t> l_converted = jni_zero::FromJniArray<std::vector<int64_t>>(               \
        env,                                                                                       \
        jni_zero::JavaRef<jlongArray>::CreateLeaky(env, static_cast<jlongArray>(l)));              \
    std::vector<float> f_converted = jni_zero::FromJniArray<std::vector<float>>(                   \
        env,                                                                                       \
        jni_zero::JavaRef<jfloatArray>::CreateLeaky(env, static_cast<jfloatArray>(f)));            \
    std::vector<double> d_converted = jni_zero::FromJniArray<std::vector<double>>(                 \
        env,                                                                                       \
        jni_zero::JavaRef<jdoubleArray>::CreateLeaky(env, static_cast<jdoubleArray>(d)));          \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_PrimitiveArrays(std::forward<decltype(args)>(args)...)) {        \
        return JNI_SampleForTests_PrimitiveArrays(std::forward<decltype(args)>(args)...);          \
      };                                                                                           \
      if constexpr (requires { func_wrapper(                                                       \
          env,                                                                                     \
          std::move(b_converted),                                                                  \
          std::move(c_converted),                                                                  \
          std::move(s_converted),                                                                  \
          std::move(i_converted),                                                                  \
          std::move(l_converted),                                                                  \
          std::move(f_converted),                                                                  \
          std::move(d_converted)); }) {                                                            \
        return func_wrapper(                                                                       \
            env,                                                                                   \
            std::move(b_converted),                                                                \
            std::move(c_converted),                                                                \
            std::move(s_converted),                                                                \
            std::move(i_converted),                                                                \
            std::move(l_converted),                                                                \
            std::move(f_converted),                                                                \
            std::move(d_converted));                                                               \
      } else if constexpr (requires { func_wrapper(                                                \
          std::move(b_converted),                                                                  \
          std::move(c_converted),                                                                  \
          std::move(s_converted),                                                                  \
          std::move(i_converted),                                                                  \
          std::move(l_converted),                                                                  \
          std::move(f_converted),                                                                  \
          std::move(d_converted)); }) {                                                            \
        return func_wrapper(                                                                       \
            std::move(b_converted),                                                                \
            std::move(c_converted),                                                                \
            std::move(s_converted),                                                                \
            std::move(i_converted),                                                                \
            std::move(l_converted),                                                                \
            std::move(f_converted),                                                                \
            std::move(d_converted));                                                               \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_PrimitiveArrays() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (std::vector<uint8_t>, std::vector<uint16_t>, std::vector<int16_t>, std::vector<int32_t>, std::vector<int64_t>, std::vector<float>, std::vector<double>)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    auto converted_ret = jni_zero::ToJniArray(env, std::move(return_value)).Release();             \
    return converted_ret;                                                                          \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1returnAString( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      int64_t nativeCPPClass,                                                                      \
      jobject caller) {                                                                            \
    auto caller_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,        \
        static_cast<::org::jni_zero::JSampleForTests>(caller));                                    \
    CPPClass* _ptr = reinterpret_cast<CPPClass*>(nativeCPPClass);                                  \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(_ptr->ReturnAString(std::forward<decltype(args)>(args)...)) {                       \
        return _ptr->ReturnAString(std::forward<decltype(args)>(args)...);                         \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, caller_ref); }) {                                 \
        return func_wrapper(env, caller_ref);                                                      \
      } else if constexpr (requires { func_wrapper(caller_ref); }) {                               \
        return func_wrapper(caller_ref);                                                           \
      } else {                                                                                     \
        static_assert(false, "CPPClass::ReturnAString() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    return return_value.ReleaseLocal();                                                            \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT int32_t Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1returnFromEnum( \
      JNIEnv* env,                                                                                 \
      jclass jcaller) {                                                                            \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_ReturnFromEnum(std::forward<decltype(args)>(args)...)) {         \
        return JNI_SampleForTests_ReturnFromEnum(std::forward<decltype(args)>(args)...);           \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env); }) {                                             \
        return func_wrapper(env);                                                                  \
      } else if constexpr (requires { func_wrapper(); }) {                                         \
        return func_wrapper();                                                                     \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_ReturnFromEnum() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: ()\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    auto return_value = dependent_context(0);                                                      \
    auto converted_ret = jni_zero::internal::PrimitiveConvert<MyEnum, int32_t>::ToJniType(         \
        env,                                                                                       \
        std::move(return_value));                                                                  \
    return static_cast<int32_t>(converted_ret);                                                    \
  }                                                                                                \
                                                                                                   \
  JNI_ZERO_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForTests_1setNonPODDatatype( \
      JNIEnv* env,                                                                                 \
      jclass jcaller,                                                                              \
      jobject obj,                                                                                 \
      jobject rect) {                                                                              \
    auto obj_ref = jni_zero::JavaRef<::org::jni_zero::JSampleForTests>::CreateLeaky(env,           \
        static_cast<::org::jni_zero::JSampleForTests>(obj));                                       \
    auto rect_ref = jni_zero::JavaRef<::android::graphics::JRect>::CreateLeaky(env,                \
        static_cast<::android::graphics::JRect>(rect));                                            \
    /* Lambda required to make "if constexpr" work properly. */                                    \
    auto dependent_context = [&](auto) {                                                           \
      /* Lambda required to disambiguate overloads. */                                             \
      auto func_wrapper = [&](auto&&... args) ->                                                   \
      decltype(JNI_SampleForTests_SetNonPODDatatype(std::forward<decltype(args)>(args)...)) {      \
        return JNI_SampleForTests_SetNonPODDatatype(std::forward<decltype(args)>(args)...);        \
      };                                                                                           \
      if constexpr (requires { func_wrapper(env, obj_ref, rect_ref); }) {                          \
        return func_wrapper(env, obj_ref, rect_ref);                                               \
      } else if constexpr (requires { func_wrapper(obj_ref, rect_ref); }) {                        \
        return func_wrapper(obj_ref, rect_ref);                                                    \
      } else {                                                                                     \
        static_assert(false, "JNI_SampleForTests_SetNonPODDatatype() is missing or has incorrect signature.\nIt should accept an optional JNIEnv* parameter as well as rvalues of the given types: (const jni_zero::JavaRef<JSampleForTests>&, const jni_zero::JavaRef<JRect>&)\nSee SampleForTests_jni.h for an example."); \
      }                                                                                            \
    };                                                                                             \
    dependent_context(0);                                                                          \
  }                                                                                                \
                                                                                                   \
                                                                                                   \
  }  /* namespace */

// Class Accessors
#ifndef org_jni_1zero_SampleForTests_clazz_defined
#define org_jni_1zero_SampleForTests_clazz_defined
inline jclass org_jni_1zero_SampleForTests_clazz(JNIEnv* env) {
  static const char kClassName[] = "this.is.a.package.prefix.org.jni_zero.SampleForTests";
  static std::atomic<jclass> cached_class;
  return jni_zero::internal::LazyGetClass(env, kClassName, &cached_class);
}
#endif

#ifndef org_jni_1zero_SampleForTests_00024InnerStructA_clazz_defined
#define org_jni_1zero_SampleForTests_00024InnerStructA_clazz_defined
inline jclass org_jni_1zero_SampleForTests_00024InnerStructA_clazz(JNIEnv* env) {
  static const char kClassName[] = "this.is.a.package.prefix.org.jni_zero.SampleForTests$InnerStructA";
  static std::atomic<jclass> cached_class;
  return jni_zero::internal::LazyGetClass(env, kClassName, &cached_class);
}
#endif

#ifndef org_jni_1zero_SampleForTests_00024InnerStructB_clazz_defined
#define org_jni_1zero_SampleForTests_00024InnerStructB_clazz_defined
inline jclass org_jni_1zero_SampleForTests_00024InnerStructB_clazz(JNIEnv* env) {
  static const char kClassName[] = "this.is.a.package.prefix.org.jni_zero.SampleForTests$InnerStructB";
  static std::atomic<jclass> cached_class;
  return jni_zero::internal::LazyGetClass(env, kClassName, &cached_class);
}
#endif


namespace jni_zero::tests {

// Native to Java functions
static ::jni_zero::ScopedJavaLocalRef<jobject> Java_SampleForTests_Constructor(
    JNIEnv* env,
    JniIntWrapper foo,
    JniIntWrapper bar) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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>",
      "(II)V",
      &cached_method_id);
  auto _ret = env->NewObject(clazz, call_context.method_id(), as_jint(foo), as_jint(bar));
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

static ::jni_zero::ScopedJavaLocalRef<jobject> Java_SampleForTests_addStructA(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    const ::jni_zero::JavaRef<jobject>& a,
    const ::jni_zero::JavaRef<jobject>& b) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "addStructA",
      "(Lthis/is/a/package/prefix/org/jni_zero/SampleForTests$InnerStructA;Lthis/is/a/package/prefix/org/jni_zero/extrapackage/ImportsTinySample;)Lthis/is/a/package/prefix/org/jni_zero/SampleForTests$InnerStructA;",
      &cached_method_id);
  auto _ret = env->CallObjectMethod(obj.obj(), call_context.method_id(), a.obj(), b.obj());
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

static ::jni_zero::ScopedJavaLocalRef<jclass> Java_SampleForTests_getClass(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    const ::jni_zero::JavaRef<jclass>& arg0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "getClass",
      "(Ljava/lang/Class;)Ljava/lang/Class;",
      &cached_method_id);
  auto _ret = env->CallObjectMethod(obj.obj(), call_context.method_id(), arg0.obj());
  jclass _ret2 = static_cast<jclass>(_ret);
  return ::jni_zero::ScopedJavaLocalRef<jclass>::Adopt(env, _ret2);
}

static std::string Java_SampleForTests_getFirstString(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    std::vector<const char*> const& array,
    const char* const& finalArg) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "getFirstString",
      "([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
      &cached_method_id);
  jni_zero::ScopedJavaLocalRef<jobject> converted_array = jni_zero::ToJniArray(
      env,
      std::move(array),
      jni_zero::g_string_class);
  jni_zero::ScopedJavaLocalRef<jobject> converted_finalArg = jni_zero::ToJniType(
      env,
      std::move(finalArg));
  auto _ret = env->CallObjectMethod(
      obj.obj(),
      call_context.method_id(),
      converted_array.obj(),
      converted_finalArg.obj());
  return jni_zero::FromJniType<std::string>(
      env,
      jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret));
}

static ::jni_zero::ScopedJavaLocalRef<jthrowable> Java_SampleForTests_getThrowable(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    const ::jni_zero::JavaRef<jthrowable>& arg0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "getThrowable",
      "(Ljava/lang/Throwable;)Ljava/lang/Throwable;",
      &cached_method_id);
  auto _ret = env->CallObjectMethod(obj.obj(), call_context.method_id(), arg0.obj());
  jthrowable _ret2 = static_cast<jthrowable>(_ret);
  return ::jni_zero::ScopedJavaLocalRef<jthrowable>::Adopt(env, _ret2);
}

static void Java_SampleForTests_iterateAndDoSomething(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_clazz(env);
  CHECK_CLAZZ(env, obj.obj(), clazz);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "iterateAndDoSomething",
      "()V",
      &cached_method_id);
  env->CallVoidMethod(obj.obj(), call_context.method_id());
}

static int32_t Java_SampleForTests_javaMethod(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    JniIntWrapper _jcaller,
    JniIntWrapper ret) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "javaMethod",
      "(II)I",
      &cached_method_id);
  auto _ret = env->CallIntMethod(
      obj.obj(),
      call_context.method_id(),
      as_jint(_jcaller),
      as_jint(ret));
  return _ret;
}

static std::vector<int32_t> Java_SampleForTests_jniTypesAndAnnotations(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    MyEnum foo,
    std::vector<int32_t> const& bar,
    JniIntWrapper baz,
    long bat) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "jniTypesAndAnnotations",
      "(I[IIJ)[I",
      &cached_method_id);
  int32_t converted_foo = jni_zero::internal::PrimitiveConvert<MyEnum, int32_t>::ToJniType(
      env,
      foo);
  jni_zero::ScopedJavaLocalRef<jobject> converted_bar = jni_zero::ToJniArray(env, std::move(bar));
  int64_t converted_bat = jni_zero::internal::PrimitiveConvert<long, int64_t>::ToJniType(env, bat);
  auto _ret = env->CallObjectMethod(
      obj.obj(),
      call_context.method_id(),
      converted_foo,
      converted_bar.obj(),
      as_jint(baz),
      converted_bat);
  return jni_zero::FromJniArray<std::vector<int32_t>>(
      env,
      jni_zero::ScopedJavaLocalRef<jintArray>::Adopt(env, static_cast<jintArray>(_ret)));
}

static void Java_SampleForTests_methodThatThrowsException(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_clazz(env);
  CHECK_CLAZZ(env, obj.obj(), clazz);
  ::jni_zero::internal::JniJavaCallContext<false> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "methodThatThrowsException",
      "()V",
      &cached_method_id);
  env->CallVoidMethod(obj.obj(), call_context.method_id());
}

static bool Java_SampleForTests_methodWithAnnotationParamAssignment(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "methodWithAnnotationParamAssignment",
      "()Z",
      &cached_method_id);
  auto _ret = env->CallBooleanMethod(obj.obj(), call_context.method_id());
  return _ret;
}

static void Java_SampleForTests_methodWithGenericParams(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj,
    const ::jni_zero::JavaRef<jobject>& _env,
    const ::jni_zero::JavaRef<jobject>& bar) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_clazz(env);
  CHECK_CLAZZ(env, obj.obj(), clazz);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "methodWithGenericParams",
      "(Ljava/util/Map;Ljava/util/LinkedList;)V",
      &cached_method_id);
  env->CallVoidMethod(obj.obj(), call_context.method_id(), _env.obj(), bar.obj());
}

static void Java_SampleForTests_packagePrivateJavaMethod(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_clazz(env);
  CHECK_CLAZZ(env, obj.obj(), clazz);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_INSTANCE>(
      env,
      clazz,
      "packagePrivateJavaMethod",
      "()V",
      &cached_method_id);
  env->CallVoidMethod(obj.obj(), call_context.method_id());
}

static ::jni_zero::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerEnum(JNIEnv* env) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "getInnerEnum",
      "()Lthis/is/a/package/prefix/org/jni_zero/SampleForTests$InnerEnum;",
      &cached_method_id);
  auto _ret = env->CallStaticObjectMethod(clazz, call_context.method_id());
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

static ::jni_zero::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerEnum(
    JNIEnv* env,
    JniIntWrapper a) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "getInnerEnum",
      "(I)Lthis/is/a/package/prefix/org/jni_zero/extrapackage/ImportsTinySample;",
      &cached_method_id);
  auto _ret = env->CallStaticObjectMethod(clazz, call_context.method_id(), as_jint(a));
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

static ::jni_zero::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerInterface(JNIEnv* env) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "getInnerInterface",
      "()Lthis/is/a/package/prefix/org/jni_zero/SampleForTests$InnerInterface;",
      &cached_method_id);
  auto _ret = env->CallStaticObjectMethod(clazz, call_context.method_id());
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

static std::vector<jni_zero::ScopedJavaLocalRef<jobject>> Java_SampleForTests_listTest1(
    JNIEnv* env,
    std::vector<std::string> const& items) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "listTest1",
      "(Ljava/util/List;)Ljava/util/Collection;",
      &cached_method_id);
  jni_zero::ScopedJavaLocalRef<jobject> converted_items = jni_zero::ToJniList(
      env,
      std::move(items));
  auto _ret = env->CallStaticObjectMethod(clazz, call_context.method_id(), converted_items.obj());
  return jni_zero::FromJniCollection<std::vector<jni_zero::ScopedJavaLocalRef<jobject>>>(
      env,
      jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret));
}

static std::map<std::string, std::string> Java_SampleForTests_mapTest1(
    JNIEnv* env,
    std::map<std::string, std::string> const& arg0) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "mapTest1",
      "(Ljava/util/Map;)Ljava/util/Map;",
      &cached_method_id);
  jni_zero::ScopedJavaLocalRef<jobject> converted_arg0 = jni_zero::ToJniType(env, std::move(arg0));
  auto _ret = env->CallStaticObjectMethod(clazz, call_context.method_id(), converted_arg0.obj());
  return jni_zero::FromJniType<std::map<std::string, std::string>>(
      env,
      jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret));
}

static std::vector<bool> Java_SampleForTests_primitiveArrays(
    JNIEnv* env,
    std::vector<uint8_t> const& b,
    std::vector<uint16_t> const& c,
    std::vector<int16_t> const& s,
    std::vector<int32_t> const& i,
    std::vector<int64_t> const& l,
    std::vector<float> const& f,
    std::vector<double> const& d) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_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,
      "primitiveArrays",
      "([B[C[S[I[J[F[D)[Z",
      &cached_method_id);
  jni_zero::ScopedJavaLocalRef<jobject> converted_b = jni_zero::ToJniArray(env, std::move(b));
  jni_zero::ScopedJavaLocalRef<jobject> converted_c = jni_zero::ToJniArray(env, std::move(c));
  jni_zero::ScopedJavaLocalRef<jobject> converted_s = jni_zero::ToJniArray(env, std::move(s));
  jni_zero::ScopedJavaLocalRef<jobject> converted_i = jni_zero::ToJniArray(env, std::move(i));
  jni_zero::ScopedJavaLocalRef<jobject> converted_l = jni_zero::ToJniArray(env, std::move(l));
  jni_zero::ScopedJavaLocalRef<jobject> converted_f = jni_zero::ToJniArray(env, std::move(f));
  jni_zero::ScopedJavaLocalRef<jobject> converted_d = jni_zero::ToJniArray(env, std::move(d));
  auto _ret = env->CallStaticObjectMethod(
      clazz,
      call_context.method_id(),
      converted_b.obj(),
      converted_c.obj(),
      converted_s.obj(),
      converted_i.obj(),
      converted_l.obj(),
      converted_f.obj(),
      converted_d.obj());
  return jni_zero::FromJniArray<std::vector<bool>>(
      env,
      jni_zero::ScopedJavaLocalRef<jbooleanArray>::Adopt(env, static_cast<jbooleanArray>(_ret)));
}

static bool Java_SampleForTests_staticJavaMethod(JNIEnv* env) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_clazz(env);
  CHECK_CLAZZ(env, clazz, clazz, false);
  ::jni_zero::internal::JniJavaCallContext<true> call_context;
  call_context.Init<::jni_zero::MethodID::TYPE_STATIC>(
      env,
      clazz,
      "staticJavaMethod",
      "()Z",
      &cached_method_id);
  auto _ret = env->CallStaticBooleanMethod(clazz, call_context.method_id());
  return _ret;
}

static ::jni_zero::ScopedJavaLocalRef<jobject> Java_InnerStructA_create(
    JNIEnv* env,
    int64_t l,
    JniIntWrapper i,
    const ::jni_zero::JavaRef<jstring>& s) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_00024InnerStructA_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,
      "create",
      "(JILjava/lang/String;)Lthis/is/a/package/prefix/org/jni_zero/SampleForTests$InnerStructA;",
      &cached_method_id);
  auto _ret = env->CallStaticObjectMethod(clazz, call_context.method_id(), l, as_jint(i), s.obj());
  return ::jni_zero::ScopedJavaLocalRef<jobject>::Adopt(env, _ret);
}

static int64_t Java_InnerStructB_getKey(JNIEnv* env, const ::jni_zero::JavaRef<jobject>& obj) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_00024InnerStructB_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,
      "getKey",
      "()J",
      &cached_method_id);
  auto _ret = env->CallLongMethod(obj.obj(), call_context.method_id());
  return _ret;
}

static ::jni_zero::ScopedJavaLocalRef<jstring> Java_InnerStructB_getValue(
    JNIEnv* env,
    const ::jni_zero::JavaRef<jobject>& obj) {
  static std::atomic<jmethodID> cached_method_id(nullptr);
  jclass clazz = org_jni_1zero_SampleForTests_00024InnerStructB_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,
      "getValue",
      "()Ljava/lang/String;",
      &cached_method_id);
  auto _ret = env->CallObjectMethod(obj.obj(), call_context.method_id());
  jstring _ret2 = static_cast<jstring>(_ret);
  return ::jni_zero::ScopedJavaLocalRef<jstring>::Adopt(env, _ret2);
}



}  // namespace jni_zero::tests

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

using namespace ::jni_zero::tests;

template<>
class _CalledByNativesStatics<::org::jni_zero::JSampleForTests> {
  public:
  static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JSampleForTests> New(
      JNIEnv* env,
      JniIntWrapper foo,
      JniIntWrapper bar) {
    return Java_SampleForTests_Constructor(env, foo, bar)
        .As<::org::jni_zero::JSampleForTests>();
  }

  static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JSampleForTests_InnerEnum> getInnerEnum(
      JNIEnv* env) {
    return Java_SampleForTests_getInnerEnum(env)
        .As<::org::jni_zero::JSampleForTests_InnerEnum>();
  }

  static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::extrapackage::JImportsTinySample> getInnerEnum(
      JNIEnv* env,
      JniIntWrapper a) {
    return Java_SampleForTests_getInnerEnum(env, a)
        .As<::org::jni_zero::extrapackage::JImportsTinySample>();
  }

  static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JSampleForTests_InnerInterface> getInnerInterface(
      JNIEnv* env) {
    return Java_SampleForTests_getInnerInterface(env)
        .As<::org::jni_zero::JSampleForTests_InnerInterface>();
  }

  static std::vector<jni_zero::ScopedJavaLocalRef<jobject>> listTest1(
      JNIEnv* env,
      std::vector<std::string> const& items) {
    return Java_SampleForTests_listTest1(env, std::move(items));
  }

  static std::map<std::string, std::string> mapTest1(
      JNIEnv* env,
      std::map<std::string, std::string> const& arg0) {
    return Java_SampleForTests_mapTest1(env, std::move(arg0));
  }

  static std::vector<bool> primitiveArrays(
      JNIEnv* env,
      std::vector<uint8_t> const& b,
      std::vector<uint16_t> const& c,
      std::vector<int16_t> const& s,
      std::vector<int32_t> const& i,
      std::vector<int64_t> const& l,
      std::vector<float> const& f,
      std::vector<double> const& d) {
    return Java_SampleForTests_primitiveArrays(
        env,
        std::move(b),
        std::move(c),
        std::move(s),
        std::move(i),
        std::move(l),
        std::move(f),
        std::move(d));
  }

  static bool staticJavaMethod(JNIEnv* env) {
    return Java_SampleForTests_staticJavaMethod(env);
  }

};

template<>
class _CalledByNatives<::org::jni_zero::JSampleForTests> {
  public:
  ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JSampleForTests_InnerStructA> addStructA(
      JNIEnv* env,
      const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests_InnerStructA>& a,
      const ::jni_zero::JavaRef<::org::jni_zero::extrapackage::JImportsTinySample>& b) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    return Java_SampleForTests_addStructA(env, *this_obj, a, b)
        .As<::org::jni_zero::JSampleForTests_InnerStructA>();
  }

  ::jni_zero::ScopedJavaLocalRef<jclass> getClass(
      JNIEnv* env,
      const ::jni_zero::JavaRef<jclass>& arg0) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    return Java_SampleForTests_getClass(env, *this_obj, arg0);
  }

  std::string getFirstString(
      JNIEnv* env,
      std::vector<const char*> const& array,
      const char* const& finalArg) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    return Java_SampleForTests_getFirstString(
        env,
        *this_obj,
        std::move(array),
        std::move(finalArg));
  }

  ::jni_zero::ScopedJavaLocalRef<jthrowable> getThrowable(
      JNIEnv* env,
      const ::jni_zero::JavaRef<jthrowable>& arg0) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    return Java_SampleForTests_getThrowable(env, *this_obj, arg0);
  }

  void iterateAndDoSomething(JNIEnv* env) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    Java_SampleForTests_iterateAndDoSomething(env, *this_obj);
  }

  int32_t javaMethod(JNIEnv* env, JniIntWrapper _jcaller, JniIntWrapper ret) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    return Java_SampleForTests_javaMethod(env, *this_obj, _jcaller, ret);
  }

  std::vector<int32_t> jniTypesAndAnnotations(
      JNIEnv* env,
      MyEnum foo,
      std::vector<int32_t> const& bar,
      JniIntWrapper baz,
      long bat) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    return Java_SampleForTests_jniTypesAndAnnotations(
        env,
        *this_obj,
        foo,
        std::move(bar),
        baz,
        bat);
  }

  void methodThatThrowsException(JNIEnv* env) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    Java_SampleForTests_methodThatThrowsException(env, *this_obj);
  }

  bool methodWithAnnotationParamAssignment(JNIEnv* env) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    return Java_SampleForTests_methodWithAnnotationParamAssignment(env, *this_obj);
  }

  void methodWithGenericParams(
      JNIEnv* env,
      const ::jni_zero::JavaRef<::java::util::JMap<jstring, ::java::util::JMap<jstring, jstring>>>& _env,
      const ::jni_zero::JavaRef<::java::util::JLinkedList<::java::lang::JInteger>>& bar) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    Java_SampleForTests_methodWithGenericParams(env, *this_obj, _env, bar);
  }

  void packagePrivateJavaMethod(JNIEnv* env) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests>*>(this);
    Java_SampleForTests_packagePrivateJavaMethod(env, *this_obj);
  }

};

template<>
class _CalledByNativesStatics<::org::jni_zero::JSampleForTests_InnerStructA> {
  public:
  static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JSampleForTests_InnerStructA> create(
      JNIEnv* env,
      int64_t l,
      JniIntWrapper i,
      const ::jni_zero::JavaRef<jstring>& s) {
    return Java_InnerStructA_create(env, l, i, s)
        .As<::org::jni_zero::JSampleForTests_InnerStructA>();
  }

};

template<>
class _CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructB> {
  public:
  int64_t getKey(JNIEnv* env) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests_InnerStructB>*>(this);
    return Java_InnerStructB_getKey(env, *this_obj);
  }

  ::jni_zero::ScopedJavaLocalRef<jstring> getValue(JNIEnv* env) const {
    auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JSampleForTests_InnerStructB>*>(this);
    return Java_InnerStructB_getValue(env, *this_obj);
  }

};


}  // namespace jni_zero_internal

namespace org::jni_zero {
using SampleForTestsJni = ::jni_zero_internal::_CalledByNativesStatics<::org::jni_zero::JSampleForTests>;
}
#ifndef _JNI_ZERO_SampleForTestsJni_DEFINED
#define _JNI_ZERO_SampleForTestsJni_DEFINED
using ::org::jni_zero::SampleForTestsJni;
#endif

namespace org::jni_zero {
using SampleForTests_InnerStructAJni = ::jni_zero_internal::_CalledByNativesStatics<::org::jni_zero::JSampleForTests_InnerStructA>;
}
#ifndef _JNI_ZERO_SampleForTests_InnerStructAJni_DEFINED
#define _JNI_ZERO_SampleForTests_InnerStructAJni_DEFINED
using ::org::jni_zero::SampleForTests_InnerStructAJni;
#endif


#pragma clang diagnostic pop
#endif  // this_is_a_package_prefix_org_jni_1zero_SampleForTests_JNI
