zworld-em/Plugins/sentry-unreal/Source/Sentry/Private/Android/Infrastructure/SentryJavaObjectWrapper.h
2025-05-11 22:07:21 +08:00

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;