// 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 ReturnType CallMethod(FSentryJavaMethod Method, ...) const; template FScopedJavaObject CallObjectMethod(FSentryJavaMethod Method, ...) const; template static ReturnType CallStaticMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...); template static ReturnType CallStaticMethod(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature, ...); template static FScopedJavaObject CallStaticObjectMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...); template static FScopedJavaObject CallStaticObjectMethod(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature, ...); jobject GetJObject() const; static FScopedJavaObject GetJString(const FString& String); private: void VerifyMethodCall(FSentryJavaMethod Method) const; void VerifyException() const; template ReturnType CallMethodInternal(FSentryJavaMethod Method, va_list Params) const; template FScopedJavaObject CallObjectMethodInternal(FSentryJavaMethod Method, va_list Params) const; protected: jobject Object; jclass Class; }; template ReturnType FSentryJavaObjectWrapper::CallMethod(FSentryJavaMethod Method, ...) const { va_list Params; va_start(Params, Method); ReturnType RetVal = CallMethodInternal(Method, Params); va_end(Params); return RetVal; } template FScopedJavaObject FSentryJavaObjectWrapper::CallObjectMethod(FSentryJavaMethod Method, ...) const { va_list Params; va_start(Params, Method); FScopedJavaObject RetVal = CallObjectMethodInternal(Method, Params); va_end(Params); return RetVal; } template<> void FSentryJavaObjectWrapper::CallMethod(FSentryJavaMethod Method, ...) const; template ReturnType FSentryJavaObjectWrapper::CallStaticMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...) { FSentryJavaObjectWrapper StaticInst(ClassData); va_list Params; va_start(Params, Method); ReturnType RetVal = StaticInst.CallMethodInternal(Method, Params); va_end(Params); return RetVal; } template 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(Method, Params); va_end(Params); return RetVal; } template FScopedJavaObject FSentryJavaObjectWrapper::CallStaticObjectMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...) { FSentryJavaObjectWrapper StaticInst(ClassData); va_list Params; va_start(Params, Method); FScopedJavaObject RetVal = StaticInst.CallObjectMethodInternal(Method, Params); va_end(Params); return RetVal; } template FScopedJavaObject 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 RetVal = StaticInst.CallObjectMethodInternal(Method, Params); va_end(Params); return RetVal; } template<> void FSentryJavaObjectWrapper::CallStaticMethod(FSentryJavaClass ClassData, FSentryJavaMethod Method, ...); template<> void FSentryJavaObjectWrapper::CallStaticMethod(FSentryJavaClass ClassData, const char* MethodName, const char* FunctionSignature, ...); template<> void FSentryJavaObjectWrapper::CallMethodInternal(FSentryJavaMethod Method, va_list Params) const; template<> bool FSentryJavaObjectWrapper::CallMethodInternal(FSentryJavaMethod Method, va_list Params) const; template<> int FSentryJavaObjectWrapper::CallMethodInternal(FSentryJavaMethod Method, va_list Params) const; template<> int64 FSentryJavaObjectWrapper::CallMethodInternal(FSentryJavaMethod Method, va_list Params) const; template<> FString FSentryJavaObjectWrapper::CallMethodInternal(FSentryJavaMethod Method, va_list Params) const; template<> FScopedJavaObject FSentryJavaObjectWrapper::CallObjectMethodInternal(FSentryJavaMethod Method, va_list Params) const; template<> FScopedJavaObject FSentryJavaObjectWrapper::CallObjectMethodInternal(FSentryJavaMethod Method, va_list Params) const;