Как использовать Flurry Analytics (.jar) в приложении Xmarin.Android?

Я хочу использовать Flurry в своем приложении Xamarin. Для этого мне нужно использовать Flurry Analytics для Android, который представляет собой файл .jar.

Для этого я создал библиотеку привязок и включил 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 может переименовывать методы, но нужен хотя бы один из этих методов (не знаю какой именно).

Кто-нибудь знает, как я могу решить эту проблему?


person Peter    schedule 30.11.2014    source источник
comment
Не глядя на фактическую привязку, ознакомьтесь с моим ответом на другой вопрос здесь stackoverflow.com/a/25407684/293609   -  person Kiliman    schedule 30.11.2014
comment
Когда я добавил '‹attr path=/api/package[@name='com.flurry.sdk']/class[@name='eg']/method[@name='a' и count(parameter)=1 и параметр[1][@type='java.lang.Object']] name=name›AnotherAMethod‹/attr›' в metadata.xml не было метода 'A', но были другие ошибки, потому что что-то еще использует этот метод . Так просто изменить имя метода не получится, потому что этот метод нужен. Не знаю, что еще я могу сделать с ним.   -  person Peter    schedule 30.11.2014
comment
Вы видели это: blog.martinlegris. com/2012/11/14/flurry-api-in-mono-for-android и этот slodge.blogspot.co.uk/2012/11/   -  person Cheesebaron    schedule 03.12.2014
comment
Спасибо Cheesebaron, все работает. Если вы сделаете ответ из этого комментария, я смогу дать вам награду :)   -  person Peter    schedule 06.12.2014


Ответы (2)


Вот готовое решение, ура!

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

}
person Peter    schedule 16.04.2015
comment
Не могли бы вы уточнить, как для этого включить необработанный .jar в проект Mono? - person Orc JMR; 22.07.2015

Flurry запутал свои API, поэтому все имена функций — A, B, C, AA и т. д. Flurry широко использует внутренние классы. C# не имеет внутренних классов. Xamarin подделывает их, перемещая из инкапсуляции. Это вызывает конфликты имен.

Хорошая сторона в том, что нам не нужен прямой доступ к подавляющему большинству библиотек Flurry, поэтому обертки не нужны. Я сказал ему исключить внутренности, добавив следующее в Metadata.xml в папке Transforms.

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

Это говорит ему исключить эти пространства имен из генератора оболочки.

person Nikhil    schedule 14.01.2015