I am trying to make a mechanism for my Android Game. I am using this code (an example)
DECLARE_DYNAMIC_DELEGATE_OneParam(FAdRewardItem, FRewardItem, item );
#if PLATFORM_ANDROID
JNI_METHOD void Java_com_epicgames_unreal_GameActivity_CPPShiUserEarnReward(JNIEnv *env, jclass clazz, jstring rewardType, jint amount)
{
FString CPPrewardType = FJavaHelper::FStringFromLocalRef(env, rewardType);
AsyncTask(ENamedThreads::GameThread, =
{
UShiAndroidLibraryBPLibrary::callUserEarnedReward(CPPrewardType, amount);
});
}
#endif
FAdRewardItem UShiAndroidLibraryBPLibrary::rewardItem;
void UShiAndroidLibraryBPLibrary::callUserEarnedReward(FString rewardType, int32 amount)
{
UShiAndroidLibraryBPLibrary::rewardItem.Type = rewardType;
UShiAndroidLibraryBPLibrary::rewardItem.Amount = amount;
AsyncTask(ENamedThreads::GameThread, [=]()
{
UShiAndroidLibraryBPLibrary::OUER.ExecuteIfBound(UShiAndroidLibraryBPLibrary::rewardItem);
});
}
FRewardEarnedDispatcher UShiAndroidLibraryBPLibrary::OUER;
void UShiAndroidLibraryBPLibrary::TestFunction(const FRewardEarnedDispatcher &onUserEarnedReward)
{
UShiAndroidLibraryBPLibrary::OUER = onUserEarnedReward;
StartAndroidFunc();
}
Now, when I call TestFunction from my GameMode, it immediately fires onUserEarnedReward delegate, what I want is it should call this delegate when CPPShiUserEarnReward is fired on JNI. What am I doing wrong ? Also, if I call TestFunction function on Blueprint node, it works as intented. What am I doing wrong here ?