151 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright (c) 2022 Sentry. All Rights Reserved.
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "SentryDataTypesAndroid.h"
 | 
						|
 | 
						|
#include "Android/AndroidJavaEnv.h"
 | 
						|
 | 
						|
class FSentryJavaObjectWrapper
 | 
						|
{
 | 
						|
protected:
 | 
						|
	FSentryJavaObjectWrapper(FSentryJavaClass ClassData);
 | 
						|
 | 
						|
public:
 | 
						|
	FSentryJavaObjectWrapper(FSentryJavaClass ClassData, const char* CtorSignature, ...);
 | 
						|
	FSentryJavaObjectWrapper(FSentryJavaClass ClassData, jobject JavaClassInstance);
 | 
						|
	virtual ~FSentryJavaObjectWrapper();
 | 
						|
 | 
						|
	FSentryJavaObjectWrapper(const FSentryJavaObjectWrapper& rhs) = delete;
 | 
						|
	FSentryJavaObjectWrapper& operator = (const FSentryJavaObjectWrapper& rhs) = delete;
 | 
						|
 | 
						|
	FSentryJavaMethod GetMethod(const char* MethodName, const char* FunctionSignature);
 | 
						|
	static FSentryJavaMethod GetStaticMethod(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature);
 | 
						|
 | 
						|
	template<typename ReturnType>
 | 
						|
	ReturnType CallMethod(FSentryJavaMethod Method, ...) const;
 | 
						|
	template<typename ReturnType>
 | 
						|
	FScopedJavaObject<ReturnType> CallObjectMethod(FSentryJavaMethod Method, ...) const;
 | 
						|
 | 
						|
	template<typename ReturnType>
 | 
						|
	static ReturnType CallStaticMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...);
 | 
						|
	template<typename ReturnType>
 | 
						|
	static ReturnType CallStaticMethod(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature, ...);
 | 
						|
	template<typename ReturnType>
 | 
						|
	static FScopedJavaObject<ReturnType> CallStaticObjectMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...);
 | 
						|
	template<typename ReturnType>
 | 
						|
	static FScopedJavaObject<ReturnType> CallStaticObjectMethod(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature, ...);
 | 
						|
 | 
						|
	jobject GetJObject() const;
 | 
						|
 | 
						|
	static FScopedJavaObject<jstring> GetJString(const FString& String);
 | 
						|
 | 
						|
private:
 | 
						|
	void VerifyMethodCall(FSentryJavaMethod Method) const;
 | 
						|
	void VerifyException() const;
 | 
						|
 | 
						|
	template<typename ReturnType>
 | 
						|
	ReturnType CallMethodInternal(FSentryJavaMethod Method, va_list Params) const;
 | 
						|
	template<typename ReturnType>
 | 
						|
	FScopedJavaObject<ReturnType> CallObjectMethodInternal(FSentryJavaMethod Method, va_list Params) const;
 | 
						|
 | 
						|
protected:
 | 
						|
	jobject Object;
 | 
						|
	jclass Class;
 | 
						|
};
 | 
						|
 | 
						|
template <typename ReturnType>
 | 
						|
ReturnType FSentryJavaObjectWrapper::CallMethod(FSentryJavaMethod Method, ...) const
 | 
						|
{
 | 
						|
	va_list Params;
 | 
						|
	va_start(Params, Method);
 | 
						|
	ReturnType RetVal = CallMethodInternal<ReturnType>(Method, Params);
 | 
						|
	va_end(Params);
 | 
						|
	return RetVal;
 | 
						|
}
 | 
						|
 | 
						|
template <typename ReturnType>
 | 
						|
FScopedJavaObject<ReturnType> FSentryJavaObjectWrapper::CallObjectMethod(FSentryJavaMethod Method, ...) const
 | 
						|
{
 | 
						|
	va_list Params;
 | 
						|
	va_start(Params, Method);
 | 
						|
	FScopedJavaObject<ReturnType> RetVal = CallObjectMethodInternal<ReturnType>(Method, Params);
 | 
						|
	va_end(Params);
 | 
						|
	return RetVal;
 | 
						|
}
 | 
						|
 | 
						|
template<>
 | 
						|
void FSentryJavaObjectWrapper::CallMethod<void>(FSentryJavaMethod Method, ...) const;
 | 
						|
 | 
						|
template<typename ReturnType>
 | 
						|
ReturnType FSentryJavaObjectWrapper::CallStaticMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...)
 | 
						|
{
 | 
						|
	FSentryJavaObjectWrapper StaticInst(ClassData);
 | 
						|
	va_list Params;
 | 
						|
	va_start(Params, Method);
 | 
						|
	ReturnType RetVal = StaticInst.CallMethodInternal<ReturnType>(Method, Params);
 | 
						|
	va_end(Params);
 | 
						|
	return RetVal;
 | 
						|
}
 | 
						|
 | 
						|
template <typename ReturnType>
 | 
						|
ReturnType FSentryJavaObjectWrapper::CallStaticMethod(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature, ...)
 | 
						|
{
 | 
						|
	FSentryJavaObjectWrapper StaticInst(ClassData);
 | 
						|
	FSentryJavaMethod Method = GetStaticMethod(ClassData, MethodName, FunctionSignature);
 | 
						|
	va_list Params;
 | 
						|
	va_start(Params, FunctionSignature);
 | 
						|
	ReturnType RetVal = StaticInst.CallMethodInternal<ReturnType>(Method, Params);
 | 
						|
	va_end(Params);
 | 
						|
	return RetVal;
 | 
						|
}
 | 
						|
 | 
						|
template<typename ReturnType>
 | 
						|
FScopedJavaObject<ReturnType> FSentryJavaObjectWrapper::CallStaticObjectMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...)
 | 
						|
{
 | 
						|
	FSentryJavaObjectWrapper StaticInst(ClassData);
 | 
						|
	va_list Params;
 | 
						|
	va_start(Params, Method);
 | 
						|
	FScopedJavaObject<ReturnType> RetVal = StaticInst.CallObjectMethodInternal<ReturnType>(Method, Params);
 | 
						|
	va_end(Params);
 | 
						|
	return RetVal;
 | 
						|
}
 | 
						|
 | 
						|
template <typename ReturnType>
 | 
						|
FScopedJavaObject<ReturnType> FSentryJavaObjectWrapper::CallStaticObjectMethod(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature, ...)
 | 
						|
{
 | 
						|
	FSentryJavaObjectWrapper StaticInst(ClassData);
 | 
						|
	FSentryJavaMethod Method = GetStaticMethod(ClassData, MethodName, FunctionSignature);
 | 
						|
	va_list Params;
 | 
						|
	va_start(Params, FunctionSignature);
 | 
						|
	FScopedJavaObject<ReturnType> RetVal = StaticInst.CallObjectMethodInternal<ReturnType>(Method, Params);
 | 
						|
	va_end(Params);
 | 
						|
	return RetVal;
 | 
						|
}
 | 
						|
 | 
						|
template<>
 | 
						|
void FSentryJavaObjectWrapper::CallStaticMethod<void>(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...);
 | 
						|
 | 
						|
template<>
 | 
						|
void FSentryJavaObjectWrapper::CallStaticMethod<void>(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature, ...);
 | 
						|
 | 
						|
template<>
 | 
						|
void FSentryJavaObjectWrapper::CallMethodInternal<void>(FSentryJavaMethod Method, va_list Params) const;
 | 
						|
 | 
						|
template<>
 | 
						|
bool FSentryJavaObjectWrapper::CallMethodInternal<bool>(FSentryJavaMethod Method, va_list Params) const;
 | 
						|
 | 
						|
template<>
 | 
						|
int FSentryJavaObjectWrapper::CallMethodInternal<int>(FSentryJavaMethod Method, va_list Params) const;
 | 
						|
 | 
						|
template<>
 | 
						|
int64 FSentryJavaObjectWrapper::CallMethodInternal<int64>(FSentryJavaMethod Method, va_list Params) const;
 | 
						|
 | 
						|
template<>
 | 
						|
FString FSentryJavaObjectWrapper::CallMethodInternal<FString>(FSentryJavaMethod Method, va_list Params) const;
 | 
						|
 | 
						|
template<>
 | 
						|
FScopedJavaObject<jobject> FSentryJavaObjectWrapper::CallObjectMethodInternal<jobject>(FSentryJavaMethod Method, va_list Params) const;
 | 
						|
 | 
						|
template<>
 | 
						|
FScopedJavaObject<jobjectArray> FSentryJavaObjectWrapper::CallObjectMethodInternal<jobjectArray>(FSentryJavaMethod Method, va_list Params) const; |