void JavaSession::InitUserClassObject()

in language-extensions/java/src/JavaSession.cpp [357:412]


void JavaSession::InitUserClassObject()
{
	jclass jUserClass = m_env->FindClass(m_mainClassName.c_str());
	if (jUserClass == nullptr)
	{
		JniHelper::ThrowOnJavaException(m_env, "Failed to find class " + m_mainClassName);
		throw runtime_error("Failed to find class " + m_mainClassName);
	}

	jclass jBaseClass = m_env->FindClass(x_javaSdkBaseExecutorClass.c_str());
	if (jBaseClass == nullptr)
	{
		JniHelper::ThrowOnJavaException(m_env, "Failed to find class " + x_javaSdkBaseExecutorClass);
		throw runtime_error("Failed to find class " + x_javaSdkBaseExecutorClass);
	}

	// Verify that the user class inhierts the SDK base class
	//
	if (JNI_FALSE == m_env->IsAssignableFrom(jUserClass, jBaseClass))
	{
		throw runtime_error(
				  "Class " + m_mainClassName + " is not a subclass of " +
				  x_javaSdkBaseExecutorClass);
	}

	// Create the object and call the default constructor
	//
	jmethodID methodId = m_env->GetMethodID(jUserClass, "<init>", "()V");
	if (methodId == nullptr)
	{
		JniHelper::ThrowOnJavaException(m_env, "Failed to find default constructor for class " + m_mainClassName);
		throw runtime_error("Failed to find default constructor for class " + m_mainClassName);
	}

	jobject jUserObj = m_env->NewObject(jUserClass, methodId);
	if (jUserObj == nullptr)
	{
		JniHelper::ThrowOnJavaException(m_env, "Failed to create object for class " + m_mainClassName);
		throw runtime_error("Failed to create object for class " + m_mainClassName);
	}

	// Create global references
	//
	m_userClass = static_cast<jclass>(m_env->NewGlobalRef(jUserClass));
	if (m_userClass == nullptr)
	{
		throw runtime_error("Failed to create global reference for class " + m_mainClassName);
	}

	m_userObject = m_env->NewGlobalRef(jUserObj);

	if (m_userObject == nullptr)
	{
		throw runtime_error("Failed to create global reference on object ");
	}
}