如何在Xmarin.Android应用程序中使用Flurry Analytics(.jar)

本文关键字:Flurry Analytics jar Xmarin Android 应用程序 | 更新日期: 2023-09-27 18:32:32

我想在我的Xamarin应用程序中使用Flurry。为此,我需要使用适用于Android的Flurry Analytics,这是一个.jar文件。

为此,我创建了绑定库,并将FlurryAnalytics-4.2.0.jar作为InputJar。但是在膨胀之后,我得到这个错误:

Com.Flurry.Sdk.Eg' already defines a member called 'A' with the same parameter types

实际上,绑定库生成了两个称为"A"的方法,这些方法具有相同的参数,但内部具有不同的代码。

删除其中一个方法不起作用。向元数据.xml文件添加特殊行可能会重命名方法,但至少需要这些方法之一(我不知道是哪一个)。

有谁知道我该如何解决这个问题?

如何在Xmarin.Android应用程序中使用Flurry Analytics(.jar)

这是现成的解决方案,干杯!

class Flurry
{
    public const string ApiKeyValue = "YOUR_API_KEY";
    private readonly IntPtr _flurryClass;
    private readonly IntPtr _flurryOnStartSession;
    private readonly IntPtr _flurryOnEndSession;
    private readonly IntPtr _flurrySetContinueSessionMillis;
    public Flurry()
    {
        _flurryClass = JNIEnv.FindClass("com/flurry/android/FlurryAgent");
        _flurryOnStartSession = JNIEnv.GetStaticMethodID(_flurryClass, "onStartSession", "(Landroid/content/Context;Ljava/lang/String;)V");
        _flurryOnEndSession = JNIEnv.GetStaticMethodID(_flurryClass, "onEndSession", "(Landroid/content/Context;)V");
        _flurrySetContinueSessionMillis = JNIEnv.GetStaticMethodID(_flurryClass, "setContinueSessionMillis", "(J)V"); 
    }
    public void OnStartActivity(Activity activity)
    {
        try
        {
            JNIEnv.CallStaticVoidMethod(_flurryClass, _flurryOnStartSession, new JValue(activity), new JValue(new Java.Lang.String(ApiKeyValue)));
        }
        catch (Exception) { }
    }
    public void OnStopActivity(Activity activity)
    {
        try
        {
            JNIEnv.CallStaticVoidMethod(_flurryClass, _flurryOnEndSession, new JValue(activity));
        }
        catch (Exception) { }
    }
    public void setContinueSessionMillis(long millis)
    {
        try
        {
            JNIEnv.CallStaticVoidMethod(_flurryClass, _flurrySetContinueSessionMillis, new JValue(millis));
        }
        catch (Exception) { }
    }
}

Flurry 混淆了他们的 API,所以所有的函数名称都是 A、B、C、AA 等。 Flurry自由地使用内部阶级。 C# 没有内部类。 Xamarin 通过将它们移出封装来伪造它们。 这会导致命名冲突。

好的一面是,我们不需要直接访问Flurry的绝大多数库,所以不需要包装器。 我告诉它通过将以下内容添加到"转换"文件夹中的元数据.xml来排除内部结构。

<metadata>
  <remove-node path="/api/package[@name='com.flurry.sdk']" />
  <remove-node path="/api/package[@name='com.flurry.android.impl.ads']" />
</metadata>

这告诉它从包装生成器中排除这些命名空间。