4

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

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

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

实际上,绑定库生成了两个名为“A”的方法,它们具有相同的参数,但内部代码不同。

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

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

4

2 回答 2

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

}
于 2015-04-16T09:48:24.103 回答
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>

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

于 2015-01-14T06:00:23.030 回答