Android Question CallSub from Inline Java Class

Jack Cole

Well-Known Member
Licensed User
Longtime User
I'm trying to modify the AdsHelper class for traditional rewarded video ads and to add some events. I'm having trouble figuring out how to call a sub in the AdsHelper class from a class within the inline java. Does anyone know how to do this?

B4X:
Sub RewardedAd_ReceviedAd
    Log("RewardedAd_ReceviedAd")
End Sub

Java:
public static class MyRewardedAdCallback extends RewardedAdLoadCallback {
    public RewardedAd ad;
    
    [USER=69643]@override[/USER]
    public void onAdFailedToLoad(LoadAdError adError) {
        BA.Log("Failed to load RewardedVideoAd: " + adError);
    }
    
    [USER=69643]@override[/USER]
    public void onAdLoaded(RewardedAd ad) {
        BA.Log("RewardedVideoAd received");
        processBA.raiseEventFromUI(this, "rewardedad_receivedad", Null);
        this.ad = ad;
    }   

}

Here is what I get:

Compiling generated Java code. Error
src\mindware\mindgames\adshelper.java:1100: error: cannot find symbol
processBA.raiseEventFromUI(this, "rewardedad_receivedad", Null);
^
symbol: variable Null
location: class MyRewardedAdCallback
Note: src\mindware\mindgames\main.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error

javac 11.0.1
 

Jack Cole

Well-Known Member
Licensed User
Longtime User
Java:
static String eventName;
static B4AClass target;

   public void setCallback(String s, B4AClass target) {
       BA.Log("setCallback");
       eventName = s.toLowerCase(BA.cul);
       this.target = target;
   }

public static class MyRewardedAdCallback extends RewardedAdLoadCallback {
    public RewardedAd ad;
    
    @Override
    public void onAdFailedToLoad(LoadAdError adError) {
        BA.Log("Failed to load RewardedVideoAd: " + adError);
        target.getBA().raiseEventFromDifferentThread(target, null, 0, eventName + "_failedtoreceivead", false, new Object[] {adError});
    }
    
    @Override
    public void onAdLoaded(RewardedAd ad) {
        BA.Log("RewardedVideoAd received");
        target.getBA().raiseEventFromDifferentThread(target, null, 0, eventName + "_receivead", false, null);
        this.ad = ad;
    }   

}

Here is what I use to set the event/callback module and sub for testing. This is in the AdsHelper module.

B4X:
Public Sub SetCallbackModule(Module As Object, Event As String)
    nativeMe = Me
    nativeMe.RunMethod("setCallback", Array(Event, Module))
End Sub

Before I fetch the ad in B4XMainPage, I run:

B4X:
Ads.SetCallbackModule(Me, "RewardAd")

Here are the event subs in B4XMainPage.

B4X:
Sub RewardAd_ReceiveAd
    LogColor($"RewardAd_ReceiveAd"$, ColorsExtra.DeepPink)
End Sub

Sub RewardAd_FailedToReceiveAd (ErrorCode As String)
    LogColor($"RewardAd_FailedToReceiveAd ErrorCode=${ErrorCode}"$, ColorsExtra.DeepPink)
End Sub
 
Upvote 0
Top