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

时间:2014-11-30 00:28:27

标签: c# xamarin xamarin.android flurry flurry-analytics

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

为此,我创建了Bindings Library,并将FlurryAnalytics-4.2.0.jar作为InputJar包含在内。但是在建造之后我得到了这个错误:

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

实际上Binding Library会生成两个名为'A'的方法,这些方法具有相同的参数,但内部的代码不同。

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

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

2 个答案:

答案 0 :(得分:1)

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

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) { }
    }

}

答案 1 :(得分:0)

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

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

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

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