我想在我的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文件添加特殊行可能会重命名方法,但至少需要其中一种方法(我不知道哪一种方法)。
有谁知道如何解决这个问题?
答案 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>
这告诉它从包装器生成器中排除这些命名空间。