вызов метода в файле smali с использованием и передачей ApplicationContext

Я новичок в маленьком мире. Я покажу средство просмотра битового кода JAVA и smali-код класса, а также какой вызов я хочу добавить. Код Java:

public final 0ai A0J(2cO param2cO)
  {
    0Ep local0Ep = this.A01;
    0q5 local0q5 = new 0q5(local0Ep);
    local0q5.A09 = 001.A01;
    Object[] arrayOfObject = new Object[2];
    int i = param2cO.A04.size();
    String str1 = "1";
    String str2 = "0";
    if (i > 0) {
      str2 = str1;
    }
    arrayOfObject[0] = str2;
    if (param2cO.A06.size() <= 0) {
      str1 = "0";
    }
    arrayOfObject[1] = str1;
    local0q5.A0E("media/seen/?reel=%s&live_vod=%s", arrayOfObject); // I want to replace the string with a method call;
    local0q5.A0E = true;
    String str3 = 2cO.A00(param2cO.A04);
    String str4 = 2cO.A00(param2cO.A07);
    String str5 = 2cO.A01(param2cO.A05);
    .......

Код Смали

.method public final A0J(LX/2cO;)LX/0ai;
    .locals 10

    .line 0
    iget-object v4, p0, LX/1dt;->A01:LX/0Ep;

    .line 1
    .line 2
    new-instance v3, LX/0q5;

    .line 3
    .line 4
    invoke-direct {v3, v4}, LX/0q5;-><init>(LX/0UX;)V

    .line 5
    .line 6
    .line 7
    sget-object v0, LX/001;->A01:Ljava/lang/Integer;

    .line 8
    .line 9
    iput-object v0, v3, LX/0q5;->A09:Ljava/lang/Integer;

    .line 10
    .line 11
    const/4 v0, 0x2

    .line 12
    new-array v6, v0, [Ljava/lang/Object;

    .line 13
    .line 14
    iget-object v0, p1, LX/2cO;->A04:Ljava/util/HashMap;

    .line 15
    .line 16
    invoke-virtual {v0}, Ljava/util/HashMap;->size()I

    .line 17
    .line 18
    .line 19
    move-result v0

    .line 20
    const-string v5, "1"

    .line 21
    .line 22
    const-string v2, "0"

    .line 23
    .line 24
    move-object v1, v2

    .line 25
    if-lez v0, :cond_0

    .line 26
    .line 27
    move-object v1, v5

    .line 28
    :cond_0
    const/4 v0, 0x0

    .line 29
    aput-object v1, v6, v0

    .line 30
    .line 31
    const/4 v1, 0x1

    .line 32
    iget-object v0, p1, LX/2cO;->A06:Ljava/util/HashMap;

    .line 33
    .line 34
    invoke-virtual {v0}, Ljava/util/HashMap;->size()I

    .line 35
    .line 36
    .line 37
    move-result v0

    .line 38
    if-gtz v0, :cond_1

    .line 39
    .line 40
    move-object v5, v2

    .line 41
    :cond_1
    aput-object v5, v6, v1

    .line 42
    .line 43
    const-string v0, "media/seen/?reel=%s&live_vod=%s"

    .line 44
    .line 45
    invoke-virtual {v3, v0, v6}, LX/0q5;->A0E(Ljava/lang/String;[Ljava/lang/Object;)V

    .line 46
    .line 47
    .line 48
    const/4 v2, 0x1

Я создал метод Java, который я хочу вызвать/вызвать:

public String is_story_mode(Context paramContext)
{

    SharedPreferences story_mod_mem = paramContext.getApplicationContext().getSharedPreferences("story_mod", 0);

    if(story_mod_mem.getString("story_mod", "").contains("on"))
    {

        return "media/seen/?reel=%s&live_vod=%s";
    }else{
        return "media/seen/?reel=%s&live_vod=%s";
    }
   }

Код Smali метода "is_story_mode"

.method public is_story_mode(Landroid/content/Context;)Ljava/lang/String;
    .registers 4

    .line 23
    invoke-virtual {p1}, Landroid/content/Context;->getApplicationContext()Landroid/content/Context;

    move-result-object p1

    const-string v0, "story_mod"

    const/4 v1, 0x0

    invoke-virtual {p1, v0, v1}, Landroid/content/Context;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;

    move-result-object p1

    .line 25
    const-string v0, "story_mod"

    const-string v1, ""

    invoke-interface {p1, v0, v1}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object p1

    const-string v0, "on"

    invoke-virtual {p1, v0}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z

    move-result p1

    if-eqz p1, :cond_1e

    .line 27
    const-string p1, "media/seen/?reel=%s&live_vod=%s"

    return-object p1

    .line 29
    :cond_1e
    const-string p1, "media/seen/?reel=%s&live_vod=%s"

    return-object p1
.end method

Я пробовал много способов сделать вызов, но каждый раз я закрывал силу. Как правильно это сделать:

local0q5.A0E(is_story_mode(this), arrayOfObject);

person beshoo mas    schedule 30.12.2019    source источник
comment
Сила закрытия, как вы ее называете, почти всегда возникает из-за исключения. Если вы посмотрите в logcat в момент возникновения исключения, вы увидите сообщение об ошибке и трассировку стека с дополнительной информацией о том, почему и где именно произошло исключение. Это должно быть первым, на что вы посмотрите (и включите в свой вопрос) в такой ситуации.   -  person JesusFreke    schedule 31.12.2019


Ответы (2)


РЕШЕНО

Заменять :

const-string v0, "media/seen/?reel=%s&live_vod=%s"

С:

.line 42
.line 43
invoke-virtual {p0, v0}, LX/1eG;->is_story_mode()Ljava/lang/String;

move-result-object v0
person beshoo mas    schedule 31.12.2019

person    schedule
comment
Эй, не могли бы вы предоставить контекст для этого ответа? Другим будет легче, когда вы объясните, почему это может решить проблему. :) - person robhasacamera; 28.12.2020