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