Java 如何在Xamarin.Android中实现RewardedLoadCallback?
我正在尝试在Xamarin.Android的C#中实现奖励广告 Android文档中的代码片段是用Java编写的,通常我在采用C#中的代码时不会遇到太多问题,但现在它似乎确实是个问题 要在Java中加载RewardedAd,必须执行以下()操作: 现在这里的问题是,在这段代码中传递的对象Java 如何在Xamarin.Android中实现RewardedLoadCallback?,java,c#,android,xamarin,admob,Java,C#,Android,Xamarin,Admob,我正在尝试在Xamarin.Android的C#中实现奖励广告 Android文档中的代码片段是用Java编写的,通常我在采用C#中的代码时不会遇到太多问题,但现在它似乎确实是个问题 要在Java中加载RewardedAd,必须执行以下()操作: 现在这里的问题是,在这段代码中传递的对象rewardedLoadCallback也定义了方法实现(onAdFailedToLoad和onAdLoaded),而在C中,这是无法做到的 因此,我的解决方案是创建自己的类,MyRewardedLoadCall
rewardedLoadCallback
也定义了方法实现(onAdFailedToLoad
和onAdLoaded
),而在C中,这是无法做到的
因此,我的解决方案是创建自己的类,MyRewardedLoadCallback
,并重写这些方法
public class MyRewardedAdLoadCallback : RewardedAdLoadCallback
{
public override void OnAdLoaded(Java.Lang.Object p0)
{
base.OnAdLoaded(p0);
}
public override void OnAdFailedToLoad(LoadAdError p0)
{
base.OnAdFailedToLoad(p0);
}
}
然后,我只需加载带有以下代码的奖励广告:
AdRequest adRequest = new AdRequest.Builder().Build();
RewardedAd.Load(this, "ca-app-pub-3940256099942544/5224354917", adRequest, new MyRewardedAdLoadCallback());
现在由于某种奇怪的原因,我在构建项目时出现了以下错误:
error: name clash: onAdLoaded(Object) in MyRewardedAdLoadCallback and onAdLoaded(AdT) in AdLoadCallback have the same erasure, yet neither overrides the other
public void onAdLoaded (java.lang.Object p0)
where AdT is a type-variable:
AdT extends Object declared in class AdLoadCallback
我试图在互联网上搜索这个错误,并得出结论,这是一个Java错误,与泛型类型有关(参见问题)。然而,我在我的代码中没有看到任何泛型类型,在Android文档中也没有关于奖励广告的内容。关于我试图实现的奖励广告,也没有Xamarin文档
如果有人能帮我解决这个问题,我真的很高兴。提前感谢。这里有一个黑客程序,可以让Xamarin.GooglePlayServices.ads版本120.0.0中的间隙广告和奖励广告都能正常工作 将以下文件添加到您的项目中(需要使用不安全标志进行构建),并使用
Android.Gms.Ads.Hack
命名空间加载您的Ads并对回调进行子类化
例如,interstitalad.Load
变成global::Android.Gms.Ads.Hack.interstitalad.Load
和interstitalaldloadcallback
变成global::Android.Gms.Ads.Hack.interstitalaldloadcallback
回调类分别将OnInterstitualAdLoaded()
和OnRewardedLoaded()
虚拟方法添加到间隙和奖励ad加载回调中
using System;
using System.ComponentModel;
using System.Diagnostics;
using Android.Content;
using Android.Runtime;
using Java.Interop;
namespace Android.Gms.Ads.Hack
{
public abstract class InterstitialAd : Java.Lang.Object
{
private static readonly JniPeerMembers _members = new XAPeerMembers("com/google/android/gms/ads/interstitial/InterstitialAd", typeof(InterstitialAd));
public unsafe static void Load(Context context, string adUnit, AdRequest request, AdLoadCallback callback)
{
IntPtr intPtr = JNIEnv.NewString(adUnit);
try
{
JniArgumentValue* ptr = stackalloc JniArgumentValue[4];
*ptr = new JniArgumentValue(context?.Handle ?? IntPtr.Zero);
ptr[1] = new JniArgumentValue(intPtr);
ptr[2] = new JniArgumentValue(request?.Handle ?? IntPtr.Zero);
ptr[3] = new JniArgumentValue(callback?.Handle ?? IntPtr.Zero);
_members.StaticMethods.InvokeVoidMethod("load.(Landroid/content/Context;Ljava/lang/String;Lcom/google/android/gms/ads/AdRequest;Lcom/google/android/gms/ads/interstitial/InterstitialAdLoadCallback;)V", ptr);
}
finally
{
JNIEnv.DeleteLocalRef(intPtr);
GC.KeepAlive(context);
GC.KeepAlive(request);
GC.KeepAlive(callback);
}
}
}
[Register("com/google/android/gms/ads/interstitial/InterstitialAdLoadCallback", DoNotGenerateAcw = true)]
public abstract class InterstitialAdLoadCallback : AdLoadCallback
{
private static readonly JniPeerMembers _members = new XAPeerMembers("com/google/android/gms/ads/interstitial/InterstitialAdLoadCallback", typeof(InterstitialAdLoadCallback));
static IntPtr class_ref => _members.JniPeerType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override JniPeerMembers JniPeerMembers => _members;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected override IntPtr ThresholdClass => _members.JniPeerType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected override Type ThresholdType => _members.ManagedPeerType;
protected InterstitialAdLoadCallback(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer)
{
}
[Register(".ctor", "()V", "")]
public unsafe InterstitialAdLoadCallback()
: base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
{
if (!(base.Handle != IntPtr.Zero))
{
SetHandle(_members.InstanceMethods.StartCreateInstance("()V", GetType(), null).Handle, JniHandleOwnership.TransferLocalRef);
_members.InstanceMethods.FinishCreateInstance("()V", this, null);
}
}
private static Delegate cb_onAdLoaded;
private static Delegate GetOnAdLoadedHandler()
{
if (cb_onAdLoaded is null)
{
cb_onAdLoaded = JNINativeWrapper.CreateDelegate((Action<IntPtr, IntPtr, IntPtr>)n_onAdLoaded);
}
return cb_onAdLoaded;
}
private static void n_onAdLoaded(IntPtr jnienv, IntPtr native__this, IntPtr native_p0)
{
InterstitialAdLoadCallback? @object = Java.Lang.Object.GetObject<InterstitialAdLoadCallback>(jnienv, native__this, JniHandleOwnership.DoNotTransfer);
global::Android.Gms.Ads.Interstitial.InterstitialAd object2 = Java.Lang.Object.GetObject<global::Android.Gms.Ads.Interstitial.InterstitialAd>(native_p0, JniHandleOwnership.DoNotTransfer);
@object!.OnInterstitialAdLoaded(object2);
}
[Register("onAdLoaded", "(Lcom/google/android/gms/ads/interstitial/InterstitialAd;)V", "GetOnAdLoadedHandler")]
public virtual void OnInterstitialAdLoaded(global::Android.Gms.Ads.Interstitial.InterstitialAd interstitialAd)
{
}
}
public abstract class RewardedAd : Java.Lang.Object
{
private static readonly JniPeerMembers _members = new XAPeerMembers("com/google/android/gms/ads/rewarded/RewardedAd", typeof(RewardedAd));
public unsafe static void Load(Context context, string adUnit, AdRequest request, RewardedAdLoadCallback callback)
{
IntPtr intPtr = JNIEnv.NewString(adUnit);
try
{
JniArgumentValue* ptr = stackalloc JniArgumentValue[4];
*ptr = new JniArgumentValue(context?.Handle ?? IntPtr.Zero);
ptr[1] = new JniArgumentValue(intPtr);
ptr[2] = new JniArgumentValue(request?.Handle ?? IntPtr.Zero);
ptr[3] = new JniArgumentValue(callback?.Handle ?? IntPtr.Zero);
_members.StaticMethods.InvokeVoidMethod("load.(Landroid/content/Context;Ljava/lang/String;Lcom/google/android/gms/ads/AdRequest;Lcom/google/android/gms/ads/rewarded/RewardedAdLoadCallback;)V", ptr);
}
finally
{
JNIEnv.DeleteLocalRef(intPtr);
GC.KeepAlive(context);
GC.KeepAlive(request);
GC.KeepAlive(callback);
}
}
}
[Register("com/google/android/gms/ads/rewarded/RewardedAdLoadCallback", DoNotGenerateAcw = true)]
public abstract class RewardedAdLoadCallback : AdLoadCallback
{
private static readonly JniPeerMembers _members = new XAPeerMembers("com/google/android/gms/ads/rewarded/RewardedAdLoadCallback", typeof(RewardedAdLoadCallback));
static IntPtr class_ref => _members.JniPeerType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override JniPeerMembers JniPeerMembers => _members;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected override IntPtr ThresholdClass => _members.JniPeerType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected override Type ThresholdType => _members.ManagedPeerType;
protected RewardedAdLoadCallback(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer)
{
}
[Register(".ctor", "()V", "")]
public unsafe RewardedAdLoadCallback()
: base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
{
if (!(base.Handle != IntPtr.Zero))
{
SetHandle(_members.InstanceMethods.StartCreateInstance("()V", GetType(), null).Handle, JniHandleOwnership.TransferLocalRef);
_members.InstanceMethods.FinishCreateInstance("()V", this, null);
}
}
private static Delegate cb_onAdLoaded;
private static Delegate GetOnAdLoadedHandler()
{
if (cb_onAdLoaded is null)
{
cb_onAdLoaded = JNINativeWrapper.CreateDelegate((Action<IntPtr, IntPtr, IntPtr>)n_onAdLoaded);
}
return cb_onAdLoaded;
}
private static void n_onAdLoaded(IntPtr jnienv, IntPtr native__this, IntPtr native_p0)
{
RewardedAdLoadCallback? @object = Java.Lang.Object.GetObject<RewardedAdLoadCallback>(jnienv, native__this, JniHandleOwnership.DoNotTransfer);
global::Android.Gms.Ads.Rewarded.RewardedAd object2 = Java.Lang.Object.GetObject<global::Android.Gms.Ads.Rewarded.RewardedAd>(native_p0, JniHandleOwnership.DoNotTransfer);
@object!.OnRewardedAdLoaded(object2);
}
[Register("onAdLoaded", "(Lcom/google/android/gms/ads/rewarded/RewardedAd;)V", "GetOnAdLoadedHandler")]
public virtual void OnRewardedAdLoaded(global::Android.Gms.Ads.Rewarded.RewardedAd rewardedAd)
{
}
}
}
使用系统;
使用系统组件模型;
使用系统诊断;
使用Android.Content;
使用Android.Runtime;
使用Java.Interop;
名称空间Android.Gms.Ads.Hack
{
公共抽象类:Java.Lang.Object
{
私有静态只读jnipermembers\u成员=新的XAPeerMembers(“com/google/android/gms/ads/interstitual/interstitulard”,typeof(interstitulard));
公共不安全静态无效加载(上下文上下文、字符串adUnit、AdRequest请求、AdLoadCallback)
{
IntPtr IntPtr=JNIEnv.NewString(adUnit);
尝试
{
JniArgumentValue*ptr=stackalloc JniArgumentValue[4];
*ptr=新的JniArgumentValue(context?.Handle?.IntPtr.Zero);
ptr[1]=新的JniArgumentValue(intPtr);
ptr[2]=新的JniArgumentValue(请求?.Handle?.IntPtr.Zero);
ptr[3]=新的JniArgumentValue(回调?.Handle?.IntPtr.Zero);
_members.StaticMethods.InvokeVoidMethod(“load.(Landroid/content/Context;Ljava/lang/String;Lcom/google/android/gms/ads/AdRequest;Lcom/google/android/gms/ads/interstitural/interstituralLoadCallback;)V”,ptr);
}
最后
{
JNIEnv.DeleteLocalRef(intPtr);
GC.KeepAlive(上下文);
GC.KeepAlive(请求);
GC.KeepAlive(回调);
}
}
}
[注册(“com/google/android/gms/ads/interstitual/interstitularaldloadcallback”,DoNotGenerateAcw=true)]
公共抽象类AdLoadCallback:AdLoadCallback
{
private static readonly jnipermembers\u members=new XAPeerMembers(“com/google/android/gms/ads/interstitial/interstitialladloadcallback”,typeof(interstitialladloadcallback));
静态IntPtr类_ref=>_members.jnipertype.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
公共覆盖JNIperMembers JNIperMembers=>\u成员;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
受保护的覆盖IntPtr ThresholdClass=>\u members.jniperType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
受保护的覆盖类型ThresholdType=>\u members.ManagedPeerType;
受保护的InterstitutionAladLoadCallback(IntPtr javaReference,JNIHandle所有权转移)
:base(javaReference,transfer)
{
}
[寄存器(“.ctor”,“()V”,”)]
public-AladLoadCallback()
:base(IntPtr.Zero、JniHandleOwnership.DoNotTransfer)
{
如果(!(base.Handle!=IntPtr.Zero))
{
SetHandle(_members.InstanceMethods.StartCreateInstance(“()V”,GetType(),null).Handle,JniHandleOwnership.TransferLocalRef);
_members.InstanceMethods.FinishCreateInstance((()V),this,null);
}
}
私有静态委托cb_已加载;
私有静态委托GetOnAdLoadedHandler()
{
如果(cb_onAdLoaded为空)
{
cb_onAdLoaded=jniativewrapper.CreateDelegate((操作)n_onAdLoaded);
}
返回已加载的cb_;
}
已加载私有静态无效(IntPtr jnienv、IntPtr native、IntPtr native)
{
InterstitialLoadCallback?@object=Java.Lang.object.GetObject(jnienv,native\uu this,JniHandleOwnership.DoNotTransfer);
全局::Android.Gms.Ads.interstitual.interstitularad object2=Java.Lang.Object.GetObject(native_p0,JniHandleOwnership.DoNotTransfer);
@对象!.onInterstitualAdLoaded(对象2);
}
[注册(“onAdLoaded”),“(Lcom/google/android/gms/ads/Interstitual/InterstituralAD;
using System;
using System.ComponentModel;
using System.Diagnostics;
using Android.Content;
using Android.Runtime;
using Java.Interop;
namespace Android.Gms.Ads.Hack
{
public abstract class InterstitialAd : Java.Lang.Object
{
private static readonly JniPeerMembers _members = new XAPeerMembers("com/google/android/gms/ads/interstitial/InterstitialAd", typeof(InterstitialAd));
public unsafe static void Load(Context context, string adUnit, AdRequest request, AdLoadCallback callback)
{
IntPtr intPtr = JNIEnv.NewString(adUnit);
try
{
JniArgumentValue* ptr = stackalloc JniArgumentValue[4];
*ptr = new JniArgumentValue(context?.Handle ?? IntPtr.Zero);
ptr[1] = new JniArgumentValue(intPtr);
ptr[2] = new JniArgumentValue(request?.Handle ?? IntPtr.Zero);
ptr[3] = new JniArgumentValue(callback?.Handle ?? IntPtr.Zero);
_members.StaticMethods.InvokeVoidMethod("load.(Landroid/content/Context;Ljava/lang/String;Lcom/google/android/gms/ads/AdRequest;Lcom/google/android/gms/ads/interstitial/InterstitialAdLoadCallback;)V", ptr);
}
finally
{
JNIEnv.DeleteLocalRef(intPtr);
GC.KeepAlive(context);
GC.KeepAlive(request);
GC.KeepAlive(callback);
}
}
}
[Register("com/google/android/gms/ads/interstitial/InterstitialAdLoadCallback", DoNotGenerateAcw = true)]
public abstract class InterstitialAdLoadCallback : AdLoadCallback
{
private static readonly JniPeerMembers _members = new XAPeerMembers("com/google/android/gms/ads/interstitial/InterstitialAdLoadCallback", typeof(InterstitialAdLoadCallback));
static IntPtr class_ref => _members.JniPeerType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override JniPeerMembers JniPeerMembers => _members;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected override IntPtr ThresholdClass => _members.JniPeerType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected override Type ThresholdType => _members.ManagedPeerType;
protected InterstitialAdLoadCallback(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer)
{
}
[Register(".ctor", "()V", "")]
public unsafe InterstitialAdLoadCallback()
: base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
{
if (!(base.Handle != IntPtr.Zero))
{
SetHandle(_members.InstanceMethods.StartCreateInstance("()V", GetType(), null).Handle, JniHandleOwnership.TransferLocalRef);
_members.InstanceMethods.FinishCreateInstance("()V", this, null);
}
}
private static Delegate cb_onAdLoaded;
private static Delegate GetOnAdLoadedHandler()
{
if (cb_onAdLoaded is null)
{
cb_onAdLoaded = JNINativeWrapper.CreateDelegate((Action<IntPtr, IntPtr, IntPtr>)n_onAdLoaded);
}
return cb_onAdLoaded;
}
private static void n_onAdLoaded(IntPtr jnienv, IntPtr native__this, IntPtr native_p0)
{
InterstitialAdLoadCallback? @object = Java.Lang.Object.GetObject<InterstitialAdLoadCallback>(jnienv, native__this, JniHandleOwnership.DoNotTransfer);
global::Android.Gms.Ads.Interstitial.InterstitialAd object2 = Java.Lang.Object.GetObject<global::Android.Gms.Ads.Interstitial.InterstitialAd>(native_p0, JniHandleOwnership.DoNotTransfer);
@object!.OnInterstitialAdLoaded(object2);
}
[Register("onAdLoaded", "(Lcom/google/android/gms/ads/interstitial/InterstitialAd;)V", "GetOnAdLoadedHandler")]
public virtual void OnInterstitialAdLoaded(global::Android.Gms.Ads.Interstitial.InterstitialAd interstitialAd)
{
}
}
public abstract class RewardedAd : Java.Lang.Object
{
private static readonly JniPeerMembers _members = new XAPeerMembers("com/google/android/gms/ads/rewarded/RewardedAd", typeof(RewardedAd));
public unsafe static void Load(Context context, string adUnit, AdRequest request, RewardedAdLoadCallback callback)
{
IntPtr intPtr = JNIEnv.NewString(adUnit);
try
{
JniArgumentValue* ptr = stackalloc JniArgumentValue[4];
*ptr = new JniArgumentValue(context?.Handle ?? IntPtr.Zero);
ptr[1] = new JniArgumentValue(intPtr);
ptr[2] = new JniArgumentValue(request?.Handle ?? IntPtr.Zero);
ptr[3] = new JniArgumentValue(callback?.Handle ?? IntPtr.Zero);
_members.StaticMethods.InvokeVoidMethod("load.(Landroid/content/Context;Ljava/lang/String;Lcom/google/android/gms/ads/AdRequest;Lcom/google/android/gms/ads/rewarded/RewardedAdLoadCallback;)V", ptr);
}
finally
{
JNIEnv.DeleteLocalRef(intPtr);
GC.KeepAlive(context);
GC.KeepAlive(request);
GC.KeepAlive(callback);
}
}
}
[Register("com/google/android/gms/ads/rewarded/RewardedAdLoadCallback", DoNotGenerateAcw = true)]
public abstract class RewardedAdLoadCallback : AdLoadCallback
{
private static readonly JniPeerMembers _members = new XAPeerMembers("com/google/android/gms/ads/rewarded/RewardedAdLoadCallback", typeof(RewardedAdLoadCallback));
static IntPtr class_ref => _members.JniPeerType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override JniPeerMembers JniPeerMembers => _members;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected override IntPtr ThresholdClass => _members.JniPeerType.PeerReference.Handle;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
protected override Type ThresholdType => _members.ManagedPeerType;
protected RewardedAdLoadCallback(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer)
{
}
[Register(".ctor", "()V", "")]
public unsafe RewardedAdLoadCallback()
: base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
{
if (!(base.Handle != IntPtr.Zero))
{
SetHandle(_members.InstanceMethods.StartCreateInstance("()V", GetType(), null).Handle, JniHandleOwnership.TransferLocalRef);
_members.InstanceMethods.FinishCreateInstance("()V", this, null);
}
}
private static Delegate cb_onAdLoaded;
private static Delegate GetOnAdLoadedHandler()
{
if (cb_onAdLoaded is null)
{
cb_onAdLoaded = JNINativeWrapper.CreateDelegate((Action<IntPtr, IntPtr, IntPtr>)n_onAdLoaded);
}
return cb_onAdLoaded;
}
private static void n_onAdLoaded(IntPtr jnienv, IntPtr native__this, IntPtr native_p0)
{
RewardedAdLoadCallback? @object = Java.Lang.Object.GetObject<RewardedAdLoadCallback>(jnienv, native__this, JniHandleOwnership.DoNotTransfer);
global::Android.Gms.Ads.Rewarded.RewardedAd object2 = Java.Lang.Object.GetObject<global::Android.Gms.Ads.Rewarded.RewardedAd>(native_p0, JniHandleOwnership.DoNotTransfer);
@object!.OnRewardedAdLoaded(object2);
}
[Register("onAdLoaded", "(Lcom/google/android/gms/ads/rewarded/RewardedAd;)V", "GetOnAdLoadedHandler")]
public virtual void OnRewardedAdLoaded(global::Android.Gms.Ads.Rewarded.RewardedAd rewardedAd)
{
}
}
}