вызов метода в файле smali с использованием ApplicationContext - PullRequest
0 голосов
/ 20 октября 2018

Я хочу вызвать метод, используя p0 ApplicationContext: Landroid / content / Context.Как я могу получить ApplicationContext для класса?

Я попытался вызвать свой метод из метода init класса, чтобы скопировать p0, но android не удалось проверить класс с помощью этого.

Есть идеи?Я предоставлю более подробную информацию, если потребуется.

@ JesusFreke: Подробнее

1 РЕДАКТИРОВАННАЯ АВАРИЯ

10-06 15:43:48.081 14308 14557 E AndroidRuntime: FATAL EXCEPTION: WFSync
10-06 15:43:48.081 14308 14557 E AndroidRuntime: Process: com.zynga.words3, PID: 14308
10-06 15:43:48.081 14308 14557 E AndroidRuntime: java.lang.VerifyError: Verifier rejected class com.zynga.wfframework.appmodel.game.GameCenter$6: void com.zynga.wfframework.appmodel.game.GameCenter$6.<init>(com.zynga.wfframework.appmodel.game.GameCenter, android.content.Context, com.zynga.wfframework.appmodel.AppModelCallback, java.util.Date, long, java.util.Date, long, com.zynga.wfframework.remoteservice.IRemoteService$PollType, com.zynga.wfframework.appmodel.sync.SyncService$SyncServicePollType, android.content.Intent, int) failed to verify: void com.zynga.wfframework.appmodel.game.GameCenter$6.<init>(com.zynga.wfframework.appmodel.game.GameCenter, android.content.Context, com.zynga.wfframework.appmodel.AppModelCallback, java.util.Date, long, java.util.Date, long, com.zynga.wfframework.remoteservice.IRemoteService$PollType, com.zynga.wfframework.appmodel.sync.SyncService$SyncServicePollType, android.content.Intent, int): 
[0x41] 'this' arg must be initialized 
(declaration of 'com.zynga.wfframework.appmodel.game.GameCenter$6' appears in /data/app/com.zynga.words3-2/base.apk:classes3.dex)
10-06 15:43:48.081 14308 14557 E AndroidRuntime:    at com.zynga.wfframework.appmodel.game.GameCenter.refreshState(SourceFile:1201)
10-06 15:43:48.081 14308 14557 E AndroidRuntime:    at com.zynga.wfframework.appmodel.game.GameCenter.refreshState(SourceFile:1144)
10-06 15:43:48.081 14308 14557 E AndroidRuntime:    at com.zynga.wfframework.appmodel.sync.SyncService$1.run(SourceFile:189)
10-06 15:43:48.081 14308 14557 E AndroidRuntime:    at java.lang.Thread.run(Thread.java:761)

2 ЧАСТИЧНЫЙ КОД

.method constructor <init>(Lcom/zynga/wfframework/appmodel/game/GameCenter;Landroid/content/Context;Lcom/zynga/wfframework/appmodel/AppModelCallback;Ljava/util/Date;JLjava/util/Date;JLcom/zynga/wfframework/remoteservice/IRemoteService$PollType;Lcom/zynga/wfframework/appmodel/sync/SyncService$SyncServicePollType;Landroid/content/Intent;I)V
    .registers 16

    ...

    #@41
    #v0=(Reference,Lcom/zynga/wfframework/remoteservice/RemoteServiceSyncResult;);v1=(Null);p0=(UninitThis,Lcom/zynga/wfframework/appmodel/game/GameCenter$6;);
    invoke-virtual {p0, v1, v0}, Lcom/zynga/wfframework/appmodel/game/GameCenter$6;->onPostExecute(ILcom/zynga/wfframework/remoteservice/RemoteServiceSyncResult;)V

Почемуp0 не инициализируется?Что я могу сделать, чтобы поймать его инициализированным?Надеюсь, вы можете помочь.Кстати, я исправил проблему другим способом, но это зависит от метода ошибки в вызываемом классе.Я бы предпочел найти другое решение.

1 Ответ

0 голосов
/ 22 октября 2018

В конструкторе аргумент this (p0) начинается как неинициализированный, и его нельзя использовать, пока он не будет инициализирован.Вы должны вызвать метод <init> суперкласса для его инициализации.

Например, если суперкласс Lcom/some/superclass;, и у него есть конструктор без аргументов, вам нужно добавить

invoke-direct {p0}, Lcom/some/superclass;-><init>()V

в какой-то момент, прежде чем пытаться использовать p0.

Предполагая, что вы начинаете с рабочего метода, для начала у конструктора уже должна быть такая инструкция.В этом случае вам просто нужно переместить вызов метода после него.

...